运行 Ubuntu Gnome。
我有很多 PDF 和其他文档,我想给它们添加标签。然后根据这些标签搜索它们。即使我将文件移动到不同的文件夹(这样,标签就会粘在文件上)。
我搜索过但文件和文档没有提供此选项。
我做错了什么吗?我该如何标记文件以便以后根据标签搜索它们?
答案1
内容:
- 介绍
- 安装
- 用法
- 源代码
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))
答案2
我已经找到了一种方法来做到这一点。
打开终端(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。例如:
重要, 九月, 演示
这将仅显示具有所有三个标签的文件:“重要”、“九月”和“演示”。
双击一个,它将在默认程序中打开该文件,右键单击并选择“显示父目录”,它将在 Nautilus 中打开其位置。
在桌面搜索中,您还可以单击窗口顶部右侧第二个按钮(通常是星号或心形)在应用程序本身中编辑标签!
就是这样!希望这能有所帮助。如果您还有其他问题,请告诉我。
答案3
答案4
Apple 在其日志文件系统中实现了这一点。对于 Linux,目前情况并非如此。当然,需要一个数据库来保持关联。
因此,有 2 条建议:
- 如果文件是纯文本文件,请使用 Evernote 或任何其他支持标记的笔记应用程序。Evernote 很棒,我已经用了好几年了。搜索速度快如闪电,标签也很容易维护(从左侧边栏)。
- 如果您不想安装上述建议的其他半生不熟的应用程序(尽管如此,还是要感谢您的建议),那么只需将标签放在文件的顶部或底部,放在一行上,并用逗号分隔。这样,只要您记住顺序,您就可以以 CSV 格式搜索它们,或者只需包括单个标签,后面或前面加一个逗号,例如:“鞋子”、“衬衫”。我知道第二种解决方案有点简陋,但它在小规模上是可行的——将有限数量的标签应用于有限数量的文件 :)