在Linux中进行文件标记的一个好的解决方案是什么?[关闭]


71

我一直在寻找标记文件并基于这些标记搜索/过滤文件的方法。

这是我的(更新的)要求:

  • 用户可读的任何文件都可以自由标记
  • 用户可以搜索与一个或多个标签匹配的文件
  • 可以在不丢失先前关联标签的情况下移动文件
  • 该系统可以轻松备份
  • 不依赖任何桌面环境
  • 如果涉及任何GUI,则必须进行CLI后备

我一直希望可以使用一些基本的文件系统和coreutils骇客来解决此问题,但是我还没有足够认真地考虑过这一点。
同时,我将回顾这里提到的beagle和metatracker,并查看它们的性能。


好的,所以beagle具有很大的gnome依赖关系,并且tracker很好,但是仍然有一些我不喜欢的依赖关系...

正在做更多的研究,并且很可能扩展文件属性
对于大多数最新文件系统来说,这是本机解决方案,但是还没有很好地支持它们(默认情况下,大多数coreutils都会销毁它们,例如cp需要-a标志来保留它们)。我想亲自尝试一些技巧时,还是想听听使用它们的想法,尽管这可能需要提出一个新的问题。


2
扩展文件属性存在的问题:(i)以我的经验,当您要备份时,它们是很麻烦的。(ii)在文件系统之间移动时不能使用它们。除此之外,它们将是正确的事情。
查尔斯·斯图尔特


在PC-BSD论坛中,参考此问题的2010版:PC-BSD,扩展属性和标记;OpenMeta和Apple的做法
Graham Perrin

Answers:


13

尚不清楚您想要哪种搜索。如果您希望它可以在Unix中的任何地方工作,而不仅仅是您的主目录,并且您只想进行基于路径名的搜索,则以下方案是可行的,并带有一些shell hackery,并且可以使用standard locatedb

  1. 每个包含至少一个标记文件的目录都需要一个标准子目录,例如.path-tags;;
  2. $ FILE目录中每个带有链接$ TAG的文件(不应包含char _)都有一个链接$TAG_$FILE -> ../$FILE

我把locate-tag脚本的细节留给你;它应该是两行或三行,仅使用locate命令和Shell hackery。(如果您有兴趣,我可以写一个)。

尽管我不记得详细信息,但一些KDE讨论了这种元数据方案。

还应该有可能基于此方案进行更复杂的内容检查测试,并使用类似的脚本将其包裹起来find

关于更新要求的想法

  1. 用户可读的任何文件都可以自由标记 -是的,应该没有问题
  2. 用户可以搜索与一个或多个标签匹配的文件 -同样
  3. 可以在不丢失先前关联的标签的情况下移动文件 -可以随意移动它们所驻留的目录,但是如果从目录中移动文件,则会遇到麻烦。如果标签采用这种形式,$TAG_$INODE_$FILE并且我们有一种有效的方法来查找哪些路径具有给定的inode,那么我们可以做到这一点,只有当我们移出文件系统时,标签才会丢失。复制文件可能会带来一些麻烦,这显然比我最初的建议要复杂。
  4. 该系统可以轻松备份 -本质上并不困难。
  5. 不依赖任何桌面环境 -无
  6. 如果涉及到gui,则必须有cli后备 -这就是我们的住所!

后记您在对(1)的回答中向我展示 的链接(2)描述的“反向inode查找”文件可用于提供一些其他基础结构。我们可以在反向查找文件上运行服务,该服务检查标记文件名中给定的每个索引节点是否与标记指向的文件的索引节点(如果有)匹配。如果不匹配,则可以执行所需的手术(该inode仍然存在吗?它在哪里?),并且可以更改或重新生成反向查找文件,并且可以更新标签符号链接。

我预计会有一个棘手的情况:如果加标签的文件不在标签应显示的位置,反向查找文件说它仍然存在,而败类文件不在查找文件说的位置,查找文件不在那怎么办?日期?有几种方法可以处理这种情况,但显然没有一个理想的方法。除此之外,这整个任务似乎是Perl非常适合的事情...


1
很好,我也一直在考虑使用符号链接。问题是,文件不能在不丢失标签的情况下移动。理想情况下,标签将是路径不可知的,并且搜索标签应返回实际文件,而不是无效的符号链接... PS:我全都基于基于shell的解决方案,但我认为问题域可以做到这一点,仅通过shell脚本进行维护将非常痛苦,我希望有人证明我错了
julien 2010年

我已对问题进行了编辑,以(希望)更清楚地说明我所寻求的解决方案。欢呼声
julien 2010年

该死的我从来没有意识到,索引节点就像文件的持久引导一样,令人深思!
julien

1
索引节点是uid,但是它们与给定的fs绑定,因此它们不是guid。这不是一件坏事,因为复制,备份,存档和&c意味着文件将被复制并存储在其他文件中,并且您希望fs状态为您提供足够的信息来解开结果。
查尔斯·斯图尔特

1
我错过了重点,什么软件可以容纳这个?我希望可以在不编写自己的基础结构的情况下随意使用。(但简单地说,以便我可以在需要时
自行扩展

22

我刚刚发布了新程序的Alpha版,试图提供此功能。当前,它满足您的部分要求,但不是全部。无论如何,您可能会感兴趣。它提供了用于标记的命令行工具和用于浏览的虚拟文件系统(其中标记由目录表示)。

http://www.tmsu.org/

用户可读的任何文件都可以自由标记

是。

用户可以搜索与一个或多个标签匹配的文件

是。通过命令行工具或浏览虚拟文件系统中的标记目录。

可以在不丢失先前关联标签的情况下移动文件

不会。但是应用程序会存储已标记文件的指纹,这些指纹用于帮助识别已移动的文件。提供了“修复”命令,该命令将更新已移动文件的路径。(显然,如果同时移动和修改文件,此机制就会失效。)

该系统可以轻松备份

是。这是一个简单的Sqlite 3数据库文件。

不依赖任何桌面环境

是。没有依赖关系,并且可以作为虚拟文件系统运行,因此可以在支持符号链接的任何程序中细读为文件系统。

如果涉及任何GUI,则必须进行CLI后备

目前没有GUI。


看起来很有趣。您是否知道如何实现在不丢失关联标签的情况下移动文件的可能性?
学生

@student:当前有一个“修复”命令,用于处理移动和修改的文件。(但是,如果您同时移动和修改文件,则不会检测到。)
Paul Ruane 2012年

人们可能会写的变体mvcp并且rm其处理您的标签,以及(打电话给他们,例如tmvtcptrm),那么人们不会失去标签至少如果使用命令行来移动文件...
学生

@student TMSU现在包括一些脚本,执行文件系统操作,同时保持数据库最新:tmsu-fs-mvtmsu-fs-rmtmsu-fs-merge
Paul Ruane 2015年

请问我的问题,但是...?为什么不自动移动文件时简单地克隆标签?移动时是否需要手动更新文件?
erm3nda 2015年

6

我认为这可能满足您的所有要求。无论如何,这是一段很酷的代码:

http://pages.stern.nyu.edu/~marriaga/software/oyepa

GUI需要Qt,但是有一个用于搜索的命令行应用程序,并且所有标签实际上都在文件名中,这一事实使得从cli操作标签|文件变得很简单。


1
在页面上:“标记信息存储在文件名中”-那么标记的文件名是什么样的?顺便说一句,该页面上的链接非常有趣:+1。
查尔斯·斯图尔特

开票报告[工作
物资

@laramichaels我知道这已经很老了,但是我发现这种方法很有趣。如果不是因为缺乏文档(没有地方解释文件命名的原理),我会采用它。如果您有关于此类工具的任何新闻,请让我知道
TomCho

6

没有人提及,但您绝对应该查看扩展的文件系统属性。例如ext4有它们。有工具getfattr和setfattr来处理它们。当然,您将必须编写一些Shell脚本来搜索标有sometag的文件。关于提到的问题,所有答案均为“是”。您应该只考虑它取决于文件系统。


文件的inode数据应该明确地是在ext4 fs上执行此操作的正确方法,但不会提供任何向后兼容性。对?
erm3nda 2015年

6

令人惊讶的是没有人提到TagSpaces。它满足您的所有要求,因为标签存储在文件名中,并且TagSpaces是跨平台的。

标签空间


1
标签空间没有CLI回退,因此不能满足所有要求。还是有CLI?如果有,请告诉我!
TomCho

Debian 9 apt中不支持该应用程序。有什么事吗 - -您可以安装这些指令应用tagspaces.org/products
莱奥列奥波尔德·赫兹준 영

您能否将您的建议与Linux桌面搜索工具进行比较?
莱奥波德·赫兹(LéoLéopoldHertz)2017年

5

您可能不需要为其标签库Nepomuk安装整个KDE桌面。但是,您仍然必须安装KDE基本库。


1
是的,我希望能找到一种替代方法,但是看起来并不...
julien

2

最近有关Linux桌面搜索工具的文章提到Tracker支持标记。不幸的是,在他们测试的旧版本中,它应该被折断了。也许现在已经解决了?

  1. 不是系统范围的。
  2. 您可以备份它。
  3. 它与Gnome捆绑在一起。

2

试试小猎犬。我觉得很好。

它可能无法满足所有要求,但我不确定该怎么做。例如,FIFO文件是否支持扩展属性?如果没有,则Beagle具有备用数据库。


beagle可以处理非常规文件吗?
查尔斯·斯图尔特

@Charles Stewart-您是指非文本文件吗?
pcapademic

不,我的意思是设备文件,符号链接,FIFO和&c
Charles Stewart 2010年

该链接不涉及有关文档组织的项目。
2014年



1

因此,您不会在gnome,命令行或Linux的其他地方找到Nepomuk集成。

相反,使用Tracker,您将找不到kde集成AFAIK。在CLI上不确定。

因此,不幸的是,答案似乎是“否”。

更不幸的是,这并不意味着这里有一个很好的机会来建立一个。例如,Linux命令行实用程序与GUI文件管理器没有太多相同之处,因此在架构上,没有可以扩展以支持该概念的通用组件。


0

我编写了一个使用SQLite的小程序。它解决了我的需求,但也许对您也有帮助:

https://github.com/alvatar/dfym

这种方法的唯一问题是不与移动和删除同步,但是它解决了相对静态文件的问题。


0

密西根州立大学

TMSU是用于标记文件的工具。它提供了一个简单的命令行实用程序,用于应用标签和虚拟文件系统,从而为您提供来自任何其他程序的文件的基于标签的视图。

TMSU不会以任何方式更改您的文件:无论您将它们放在磁盘上还是在网络上,它们都保持不变。TMSU维护自己的数据库,您只需获得一个附加视图,即可根据您设置的标签将其安装在所需的位置。

惊讶的是没有人提到它。


1
您错过了它……这是投票率最高的答案
pufferfish

-1

我建议针对文件系统之上和之外的这些功能,看看诸如Subversion之类的版本控制系统。有些可能比其他更适合您,但通常是:

  • 许多支持标记(一定是颠覆)。
  • 许多是跨平台的;Windows,Mac,Linux,几乎所有的Unix。
  • 许多服务器同时具有GUI前端和命令行客户端。
  • 许多人已经具有您喜欢的编程/脚本语言的绑定。
  • 许多都容易备份。
  • 许多设计为可以很容易地以一种或另一种方式共享。
  • 许多允许您控制访问。
  • 您不必重新发明轮子。
    • 您将学习和使用数以百万计的标准命令/工具。
  • 您可以立即将其安装到自己喜欢的OS存储库中。apt-get安装,yum安装
  • 您还可以免费获得版本管理。

Subversion的cli示例: ~/svn/atestrepository: $ svn propset mytag "something" dir1 property 'mytag' set on 'dir1' $ svn propset myothertag "nothing" dir1/file1 property 'myothertag' set on 'dir1/file1' $ svn propset anemptytag "" dir1/file2 property 'anemptytag' set on 'dir1/file2'

$ svn propget -R mytag dir1 - something ~/svn/atestrepository: $ svn propget -R myothertag dir1/file1 - nothing $ svn propget -R anemptytag dir1/file2 - $ svn proplist dir1/file2 Properties on 'dir1/file2': anemptytag svn:keywords

我不建议这些工具用于大型(千兆字节)定期更改的二进制文件,但对于其他所有工具,它们已经得到了很好的验证,并且可以扩展到非常大的大小。

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.