我一直在寻找一种方法来标记我的文件并根据这些标签搜索/过滤它们。
以下是我的(更新) 要求 :
- 任何用户可读的文件都可以自由标记
- 用户可以搜索与一个或多个标签匹配的文件
- 可以移动文件而不会丢失先前关联的标签
- 系统可以轻松备份
- 不依赖任何桌面环境
- 如果涉及任何 GUI,则必须有一个 CLI 回退
我一直希望使用一些基本的文件系统和 coreutils 技巧来处理这个问题,但我还没有认真考虑过这个问题。
同时,我将回顾一下这里提到的 beagle 和 metatracker,看看它们的表现如何。
好的,所以 beagle 有大量的 gnome 依赖性,并且 tracker 还不错,但仍然有一些我不喜欢的依赖性......
我做了更多的研究,接下来的路很可能是扩展文件属性。
这是针对大多数最新文件系统的原生解决方案,但它们目前还没有得到很好的支持(大多数 coreutils 默认会销毁它们,例如 cp 需要 -a 标志来保留它们)。当我自己尝试一些 hack 时,想听听关于使用它们的一些想法,尽管这可能需要提出一个新问题。
答案1
不清楚您想要哪种搜索。如果您希望它在 unix 中的任何地方工作,而不仅仅是您的主目录,并且您只想进行基于路径名的搜索,则以下方案是可行的,只需一点 shell hackery,并使用标准locatedb
:
- 每个包含至少一个标记文件的目录都需要一个标准子目录,例如
.path-tags
; - 目录 $FILE 中带有链接 $TAG 的每个文件(不应包含字符
_
)都有一个链接$TAG_$FILE -> ../$FILE
我将脚本的细节留给locate-tag
您;它应该是两行或三行代码,仅使用locate
命令和 shell 技巧。(如果您感兴趣,我可以写一个)。
一些 KDE 成员谈到了这种元数据方案,尽管我不记得细节了。
还应该能够基于此方案使用类似的脚本进行更复杂的内容检查测试find
。
对更新要求的思考
- 任何用户可读的文件都可以自由标记- 是的,应该没问题
- 用户可以搜索与一个或多个标签匹配的文件- 同样地
- 可以移动文件而不会丢失先前关联的标签- 它们所在的目录可以自由移动,但如果文件从目录中移动,我们就有麻烦了。如果标签采用以下形式,我们
$TAG_$INODE_$FILE
有查找具有给定 inode 的路径的有效方法,那么我们就可以这样做,只有当我们移出文件系统时才会丢失标签。复制文件可能会带来一些麻烦,这显然比我最初的建议更复杂。 - 系统可以轻松备份- 本质上并不困难。
- 不依赖任何桌面环境- 没有任何
- 如果涉及任何 GUI,则必须有一个 CLI 回退- 那就是我们住的地方!
后记 链接描述的“反向 inode 查找”文件(2)你回答的时候告诉我(1)可用于提供一些额外的基础设施。我们可以在反向查找文件上运行服务,该服务检查标记文件名中给出的每个 inode 是否与标记指向的文件的 inode(如果有)匹配。如果不匹配,则可以执行所需的操作(inode 是否仍然存在?它在哪里?),并且反向查找文件将被变异或重新生成,并且标记符号链接将被更新。
我预计会出现一种棘手的情况:如果标记文件不在标记所指的位置,反向查找文件显示它仍然存在,但浪子文件不在查找文件所指的位置,查找文件已过期,该怎么办?有几种方法可以处理这种情况,但没有一种显然是理想的。除此之外,这整个任务似乎是 Perl 非常适合做的那种事情……
答案2
我刚刚发布了一个新程序的 alpha 版本,它试图提供此功能。它目前满足了您的部分要求,但不是全部。无论如何,它可能会让您感兴趣。它提供了一个用于标记的命令行工具和一个用于浏览的虚拟文件系统(其中标记由目录表示)。
任何用户可读的文件都可以自由标记
是的。
用户可以搜索与一个或多个标签匹配的文件
是的。可以通过命令行工具或浏览虚拟文件系统中的标签目录。
可以移动文件而不会丢失先前关联的标签
不会。但是应用程序会存储标记文件的指纹,这些指纹可用于帮助识别已移动的文件。提供了“修复”命令,用于更新已移动文件的路径。(如果文件既被移动又被修改,则此机制显然会失效。)
系统可以轻松备份
是的。这是一个简单的 Sqlite 3 数据库文件。
不依赖任何桌面环境
是的。没有依赖关系,而且由于它可以作为虚拟文件系统运行,因此可以在任何支持符号链接的程序中将其作为文件系统使用。
如果涉及任何 GUI,则必须有一个 CLI 回退
目前没有 GUI。
答案3
没人提到,但你肯定应该看看扩展文件系统属性。例如,ext4 就有这些属性。有 getfattr 和 setfattr 工具来处理它们。当然,你必须编写一些 shell 脚本来搜索带有 sometag 标签的文件。关于提到的问题,所有答案都是“是”。你只需要考虑到它依赖于文件系统。
答案4
我认为这可能满足您的所有要求。无论如何,这是一段很酷的代码:
http://pages.stern.nyu.edu/~marriaga/software/oyepa
GUI 需要 Qt,但有一个用于搜索的命令行应用程序,并且所有标签实际上都在文件名中,这使得从 cli 操作标签|文件变得非常简单。