如何标记文件并在以后基于标记进行搜索?


15

运行Ubuntu Gnome。

我有很多PDF和其他文档,我想标记它们。然后根据这些标签搜索它们。即使我将文件移动到其他文件夹(因此,标签也会粘贴在文件上)。

我进行了搜索,但“文件和文档”未提供此选项。

难道我做错了什么?如何标记文件,以便以后可以基于标记搜索文件?


对于仅向问题的PDF文档添加标签(而不是问题的搜索标签),请参阅此答案
karel 2016年

您是否会将文件“添加书签”作为选项而不是进行标记?
Sergiy Kolodyazhnyy

@Serg,我不清楚。你能解释一下吗?这些书签可以具有Firefox书签之类的标签吗?即使我移动文件,它们也会保留吗?
deshmukh's

@deshmukh这是我之前做过的事情:askubuntu.com/q/803644/295286 基本上,它创建一个符号链接到文件夹中的文件。另一方面,我可以实现某种标签列表,对于每个标签,都有文件列表。目前,我有点忙,因此需要我一辈子做出回应,但我会尽力尽快给出答案。一旦这一次超时,是否有可能再次给予赏金?
Sergiy Kolodyazhnyy

@Serg我不够有钱,无法提供另一笔赏金:)但是,如果没有任何人赢得这笔赏金(甚至有可能吗?),并且如果您的答案(当它出现时)是最好的,当然,我会提供赏金给您:) :)
deshmukh '16

Answers:


9

内容:

  1. 介绍
  2. 安装
  3. 用法
  4. 源代码

1.简介

该解决方案包含两个脚本-一个用于标记,一个用于读取特定标记下的文件列表。两者都必须~/.local/share/nautilus/scripts通过在Nautilus文件管理器中的任何文件上单击鼠标右键,然后导航到“脚本”子菜单来生存和激活。每个脚本的源代码都在此处以及上提供。 GitHub上

2.安装

两个脚本保存到~/.local/share/nautilus/scripts,那里~是用户的主目录,并提出可执行文件chmod +x filename。为了易于安装,请使用以下bash脚本:

#!/bin/bash

N_SCRIPTS="$HOME/.local/share/nautilus/scripts"
cd /tmp
rm master.zip*
rm -rf nautilus_scripts-master
wget https://github.com/SergKolo/nautilus_scripts/archive/master.zip
unzip master.zip
install nautilus_scripts-master/tag_file.py "$N_SCRIPTS/tag_file.py"
install nautilus_scripts-master/read_tags.py "$N_SCRIPTS/read_tags.py"

3.用法:

标记文件

在Nautilus文件管理器中选择文件,右键单击它们,然后导航到“脚本”子菜单。选择 tag_file.py。单击“ Enter 在此处输入图片说明 首次运行此脚本”,将没有配置文件,因此您将看到以下内容:

在此处输入图片说明

下次,当您已经标记了一些文件时,您将看到一个弹出窗口,允许您选择一个标签和/或添加一个新标签(这样您可以将文件记录在多个标签下)。点击OK可将文件添加到此标签。注意:避免使用“ |” 标签名称中的符号。

在此处输入图片说明

该脚本将所有内容记录在中~/.tagged_files。该文件实质上是一个json字典(普通用户不必关心它,但是对程序员来说很方便:))。该文件的格式如下:

{
    "Important Screenshots": [
        "/home/xieerqi/\u56fe\u7247/Screenshot from 2016-10-01 09-15-46.png",
        "/home/xieerqi/\u56fe\u7247/Screenshot from 2016-09-30 18-47-12.png",
        "/home/xieerqi/\u56fe\u7247/Screenshot from 2016-09-30 18-46-46.png",
        "/home/xieerqi/\u56fe\u7247/Screenshot from 2016-09-30 17-35-32.png"
    ],
    "Translation Docs": [
        "/home/xieerqi/Downloads/908173 - \u7ffb\u8bd1.doc",
        "/home/xieerqi/Downloads/911683\u7ffb\u8bd1.docx",
        "/home/xieerqi/Downloads/914549 -\u7ffb\u8bd1.txt"
    ]
}

如果您要“取消标记”某些文件,只需从该列表中删除一个条目即可。注意格式和逗号。

按标签搜索

现在您已经有了一个不错~/.tagged_files的文件数据库,您可以读取该文件或使用read_tags.py脚本。

右键单击Nautilus中的任何文件(实际上无关紧要)read_tags.py。选择。击中Enter 在此处输入图片说明

您将看到一个弹出窗口,询问您要搜索的标签:

在此处输入图片说明

选择一个,然后单击OK。您将看到一个列表对话框,显示您希望所选标签存在的文件。您可以选择任何单个文件,它将以分配给该文件类型的默认程序打开。

在此处输入图片说明

4.源代码:

tag_file.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Author: Serg Kolo  
# Date: Oct 1st, 2016
# Description: tag_file.py, script for
#    recording paths to files under 
#    specific , user-defined tag
#    in ~/.tagged_files
# Written for: http://askubuntu.com/q/827701/295286
# Tested on : Ubuntu ( Unity ) 16.04

from __future__ import print_function
import subprocess
import json
import os
import sys

def show_error(string):
    subprocess.call(['zenity','--error',
                     '--title',__file__,
                     '--text',string
    ])
    sys.exit(1)

def run_cmd(cmdlist):
    """ Reusable function for running external commands """
    new_env = dict(os.environ)
    new_env['LC_ALL'] = 'C'
    try:
        stdout = subprocess.check_output(cmdlist, env=new_env)
    except subprocess.CalledProcessError:
        pass
    else:
        if stdout:
            return stdout


def write_to_file(conf_file,tag,path_list):

    # if config file exists , read it
    data = {}
    if os.path.exists(conf_file):
        with open(conf_file) as f:
            data = json.load(f)

    if tag in data:
        for path in path_list:
            if path in data[tag]:
               continue
            data[tag].append(path)
    else:
        data[tag] = path_list

    with open(conf_file,'w') as f:
        json.dump(data,f,indent=4,sort_keys=True)

def get_tags(conf_file):

    if os.path.exists(conf_file):
       with open(conf_file) as f:
            data = json.load(f)
            return '|'.join(data.keys())

def main():

    user_home = os.path.expanduser('~')
    config = '.tagged_files'
    conf_path = os.path.join(user_home,config)
    file_paths = [ os.path.abspath(f) for f in sys.argv[1:] ]
    tags = None

    try:
        tags = get_tags(conf_path)
    except Exception as e:
        show_error(e)

    command = [ 'zenity','--forms','--title',
                'Tag the File' 
    ]

    if tags:
       combo = ['--add-combo','Existing Tags',
                '--combo-values',tags
       ]

       command = command + combo

    command = command + ['--add-entry','New Tag']

    result = run_cmd(command)
    if not result: sys.exit(1)
    result = result.decode().strip().split('|')
    for tag in result:
        if tag == '':
           continue
        write_to_file(conf_path,tag,file_paths)

if __name__ == '__main__':
     main()

read_tags.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Author: Serg Kolo  
# Date: Oct 1st, 2016
# Description: read_tags.py, script for
#    reading  paths to files under 
#    specific , user-defined tag
#    in ~/.tagged_files
# Written for: http://askubuntu.com/q/827701/295286
# Tested on : Ubuntu ( Unity ) 16.04

import subprocess
import json
import sys
import os


def run_cmd(cmdlist):
    """ Reusable function for running external commands """
    new_env = dict(os.environ)
    new_env['LC_ALL'] = 'C'
    try:
        stdout = subprocess.check_output(cmdlist, env=new_env)
    except subprocess.CalledProcessError as e:
        print(str(e))
    else:
        if stdout:
            return stdout

def show_error(string):
    subprocess.call(['zenity','--error',
                     '--title',__file__,
                     '--text',string
    ])
    sys.exit(1)

def read_tags_file(file,tag):

    if os.path.exists(file):
       with open(file) as f:
            data = json.load(f)
            if tag in data.keys():
                return data[tag]
            else:
                show_error('No such tag')
    else:
       show_error('Config file doesnt exist')

def get_tags(conf_file):
    """ read the tags file, return
        a string joined with | for
        further processing """    
    if os.path.exists(conf_file):
       with open(conf_file) as f:
            data = json.load(f)
            return '|'.join(data.keys())

def main():

    user_home = os.path.expanduser('~')
    config = '.tagged_files'
    conf_path = os.path.join(user_home,config)

    tags = get_tags(conf_path)
    command = ['zenity','--forms','--add-combo',
               'Which tag ?', '--combo-values',tags
    ]

    tag = run_cmd(command)

    if not tag:
       sys.exit(0)

    tag = tag.decode().strip()
    file_list = read_tags_file(conf_path,tag)
    command = ['zenity', '--list', 
               '--text','Select a file to open',
               '--column', 'File paths'
    ]
    selected = run_cmd(command + file_list)    
    if selected:
       selected = selected.decode().strip()
       run_cmd(['xdg-open',selected])

if __name__ == '__main__':
    try:
        main()
    except Exception as e:
        show_error(str(e))


这很酷。您总是有最有趣的解决方案。

@Serg,太好了。移动文件时标签会粘住吗?或者,当我删除文件时,它们仍会显示在搜索结果中吗?
deshmukh

@deshmukh不,如果您移动文件,标签不会粘住,并且删除的文件会显示出来。我可以实现检查已删除的文件(实际上很容易,只有几行)。本质上,您具有标签及其文件的数据库,并且必须维护该数据库
Sergiy Kolodyazhnyy

@Serg我们离我们很近。因为除非标签对文件“粘”(即使在移动文件后它们仍然保留),否则它与分层目录结构的优缺点相同,只是一个文件可以具有多个标签。即使有一刻,我也没有贬低您的出色工作。我只是说这仍然不能解决我的(可能是疯狂的)需求。而且,正如jargonjunkie在单独的评论中所说,可能直接标记文件可能是解决方案(就像我们标记照片或书签一样)。但是这些都是新手的话。
deshmukh

@deshmukh我同意,直接标记文件将是理想的选择。我只是没有找到一种方法,至少现在还没有。我尝试了几种方法,但是它们没有产生任何结果。我可能会制作一个脚本来定期检查所有文件是否都到位,但这是我所能做的最好的事情,并且如果配置文件中文件的数量增加,效率将非常低下。我希望这对某些人有用,但我同意-这并非您正在寻求的解决方案
Sergiy Kolodyazhnyy

1

我找到了一种方法。

打开一个终端(CTRL+ ALT+ T),然后运行以下命令:

sudo add-apt-repository ppa:tracker-team/tracker

输入您的密码,并在提示时按回车,然后运行

sudo apt-get update

然后

sudo apt-get install tracker tracker-gui

如果它已经是最新版本,请不要担心。

现在打开Nautilus / Files,然后右键单击要添加标签的文档。选择属性,然后选择显示“标签”的选项卡。在文本框中输入标签,然后按Enter键或单击“添加”按钮添加标签。您也可以单击已添加的标签,然后选择“删除”按钮以删除标签。请注意,标签区分大小写。您创建的标签将在整个系统中保持不变,因此您可以轻松地在已创建的标签旁边打勾以标记该文件,而无需再次手动键入该标签。

标记所需的项目后,您现在可以搜索它们,但不能在“文件”中搜索。前往活动,并搜索应用Desktop Search。启动它,然后查看顶部的选项。在窗口的左上方,单击带有工具提示“按列表中的文件显示结果”的文件夹图标。现在,您有更多选择。使用工具提示“仅在文件标签中查找搜索条件”选择搜索框左侧的选项。现在您可以搜索标签了!

要使用此功能,请输入要搜索的标签,并用逗号分隔,然后按Enter。例如:

重要,9月,演示

这将仅显示具有所有三个标签的文件:“重要”,“ 9月”和“演示”。

双击一个,它将在默认程序中打开文件,然后右键单击并选择“显示父目录”,它将在Nautilus中打开它的位置。

在桌面搜索中,您也可以单击窗口顶部右侧的第二个按钮(通常是星号或心形)来编辑应用程序本身中的标签!

你有它!希望这可以帮助。如果您还有其他问题,请告诉我。


0

简短的答案:这在Ubuntu中是不可能的。根据其他答案的建议,您需要一些扩展名或文档数据库。

我可以推荐的另一种选择是使用应用程序TagSpaces。此应用程序可以将标签保存在filename中,从而使标签持久且可移植。您可以在Nautilus或Cloud-Storage中编辑文件名,标签将显示在TagSpaces中,反之亦然。

屏幕截图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.