#tags #search #xattr #linux-macos #regex

bin+lib xtagger

用于管理并搜索存储在文件系统扩展属性中的标签的命令行应用程序

5 个版本 (稳定版)

1.2.1 2024年6月24日
1.2.0 2023年1月15日
1.1.0 2022年6月3日
1.0.0 2022年5月16日
0.1.0 2022年5月10日

#264 in 文件系统

MIT 许可证

23KB
306

xtagger - 使用标签查找文件

xtagger 是一个控制台应用程序,允许您管理并查找文件中的标签。虽然类似的应用程序(如 TMSUTagsistant)使用数据库来管理文件/标签关系,而其他(如 TagSpaces)则使用辅助文件或编码在文件名中的标签。xtagger 的不同之处在于,它使用 Linux 和 macOS 支持的文件系统的扩展属性。

这解决了大多数其他解决方案中普遍存在的一个问题:您可以使用您喜欢的工具移动或重命名文件,而不会丢失在别处管理的文件/标签关系[^1]。

用法

使用以下命令安装此控制台应用程序

$ cargo install xtagger

通用

要获取有关 xtagger 及其命令行界面的通用帮助,您可以发出

$ xtagger --help

xtagger 支持Perl风格的正则表达式,但没有支持前瞻。

xtagger 执行操作的顺序是固定的,如下所示。

  • 过滤
  • 复制
  • 重命名
  • 删除
  • 添加
  • 输出
  • 删除

标签

在 xtagger 中,标签可以独立存在,也可以具有关联的值。标签或值可以包含数字字符以及以下字符::_-。标签和值始终区分大小写处理。

xtagger 将所有标签存储在名为 user.xtag 的扩展属性中。这意味着您可以使用列出与文件关联的扩展属性的一般工具,如 macOS 上的 xattr 或 Linux 上的 getfattr,来查看文件是否具有 xtag 属性。

操作的顺序是重命名、删除和添加。所有操作都在输出之前完成,删除操作随后进行。您始终可以使用 --dry_run 选项来检查命令会做什么,但不会进行任何更改。

向文件添加标签

选项 --add 允许您添加或更改文件的标签。使用逗号分隔的列表来添加多个标签。标签/值对使用 = 分隔。

$ xtagger --add "ARM,Samsung,ARMFamily=ARM9E,ARMArchitecture=ARMv5TEJ,ARMCore=ARM926EJ-S" "Samsung S3C2416.pdf"

在这里,我们添加了独立的标签 ARMSamsung,以及标签/值对 ARMFamilyARMArchitectureARMCore,它们分别与相关的值 ARM9EARMv5TEJARM926EJ 关联,并将它们添加到单个给定的文件中。

如果已经存在带有或没有相关值的 ARMArchitecture 标签,则新值将替换旧值或创建新的值条目。

xtagger 对标签组或层次结构没有特定的支持。但您可以通过使用 : 来分隔级别,为您的标签赋予更多的意义。

从文件中删除标签

要删除文件中的特定标签,请使用 --remove 选项。您可以提供要删除的逗号分隔的标签列表。

$ xtagger --remove "ARM" "*.pdf"

这将使用 xtagger 的自身 glob 机制删除当前文件夹中所有 PDF 的 ARM 标签,无论是否有相关值。

要删除给定文件的所有标签以及整个扩展属性,您可以使用

$ xtagger --delete *.pdf

重命名标签

--find--replace 选项允许您使用正则表达式替换重命名现有标签。

$ xtagger --find "ARM" --replace "Risc-V" *.pdf

只需将给定文件中的 ARM 标签替换为 Risc-V,同时保留任何相关值。

$ xtagger --find "ARM(.*)" --replace "Risc-V\$1" *.pdf

使用捕获组将 ARMFamily 标签重命名为 Risc-VFamily。请注意,在替换模式中使用了转义 $ 符号。这是必需的,以防止 shell 将其替换为环境变量。您也可以使用单引号。

此重命名机制也支持命名捕获组。

复制标签

--copy 选项允许您将标签从第一个处理的文件复制到所有其他文件。

选择文件

要定义 xtagger 应该处理的文件,您可以使用多个正常的 shell glob。对于大量的文件,xtagger 支持其自身的 glob 机制。只需将 glob 放在引号内[^2]。如果您需要特殊的选择标准,您可以将 xtagger 作为 find 命令的 exec 目标,例如。

过滤文件

您可以使用 --filter--bookmark 选项根据标签过滤提供的文件。因为没有中央数据库,所以查找信息是一个更耗时的搜索操作,这取决于文件系统的速度。

对标签的基于条件的操作

xtagger 支持自然条件运算符 AND OR NOT 以及它们的符号对应物 && ||! 分别。自然变体不区分大小写,并且需要它们周围有空格,而符号变体可以使用而不需要。AND 运算符的优先级高于 OR 运算符。您可以使用括号来影响所需的优先级。ANDOR 运算符是左结合的,并使用短路评估。

$ xtagger --filter "Samsung and ARMFamily" --list *.pdf

这将在当前文件夹中查找同时具有 SamsungARMFamily 标签的 PDF 文件,而不考虑它们是否具有相关值。

值之间的等价/不等价/关系操作

等价和不等价分别使用 ==!=,并通过值的字符串表示进行测试。关系使用 <<=>=>,而值将被转换为有符号整数以进行比较。

$ xtagger --filter "Samsung and ARMFamily == ARM9E and Year >= 2006" --list *.pdf

查找具有 Samsung 标签(带或不带相关值)、具有关联值 ARM9EARMFamily 标签,并且具有整数值大于或等于 2006 的 Year 标签的 PDF 文件。

如果使用正则表达式进行标签匹配,则 == 匹配如果至少有一个标签具有匹配的值。而 != 操作符匹配如果没有任何值匹配。

正则表达式

您可以使用正则表达式在模式中查找标签或值。由于不等价测试转换为整数,因此不能与它们一起使用正则表达式。正则表达式总是匹配整个标签或值。

$ xtagger --filter "ARM(Family|Core) == .*J.*" --list *.pdf

将返回具有与 ARMFamilyARMCore 标签相关联的 'J' 的值的文件。

书签

在 xtaggers 的意义上,书签只是文件系统中的符号链接。它们可以用来存储重复的搜索或提供同义词。

创建书签

xtagger 没有创建书签的特定支持。使用标准工具创建一个。例如

$ ln -s "ARM(Family|Core) == .*J.*" Jazelle

创建一个名为 Jazelle 的符号链接,其目标为筛选器术语。

$ ln -s "DarkGreen or ForestGreen or Green" Green
creates synonyms for the color green.

使用类似以下命令

$ ls -l *

可以列出您的书签以及它们的筛选器术语。

使用书签

书签可以很容易地独立使用,例如

$ xtagger --bookmark Jazelle --list *.pdf

而不是直接使用筛选器术语,或者您可以将它们添加到您的搜索术语中。

$ xtagger --filter "{Green} and Round" --list *.pdf

这样,书签会隐式地包含括号。

输出选项

可以以多种方式查看与 xtaggers 过滤器匹配的文件。例如,您可以始终添加 --list 以获取在此调用中已处理的文件的列表。

如果您正在使用支持超链接的终端的图形用户界面进行交互式操作,则可以添加 -h 选项。然后 xtagger 将为列出的文件创建超链接,您可以用鼠标单击打开它们。

仅列出文件

选项 --list 将简单地按行列出所有匹配的文件。

显示带标签的文件

要列出带有其标签的文件,请使用 --show 选项。

$ xtagger --show -h *.pdf

这将在每行显示具有超链接支持的文件名及其标签和值,并缩进显示。

Samsung S3C2416.pdf
  ARMArchitecture=ARMv5TEJ
  ARMCore=ARM926EJ-S
  ARMFamily=ARM9E

列出使用的标签

要仅列出文件集中使用的所有标签,请使用 --tags 选项。

$ xtagger --tags *.pdf

将按字母顺序列出标签,每行一个。

平台支持

在 Linux 和 macOS 上运行。

许可

该项目受 MIT 许可证 的许可。

脚注

[^1]: 请注意,并非所有文件系统都能使用扩展属性,或者您的 Linux 内核可能根本不支持在内核中编译它们。例如,较旧的 NFS 实现可能不支持它们,并且您可能需要使用特殊的配置/挂载选项才能启用它们。另一方面,Linux 上实际的 NTFS 支持扩展属性!在任何情况下,在文件系统之间移动文件时,您可能会在不知情的情况下丢失扩展属性。请查阅您系统的组件文档以了解扩展属性支持或进行测试。

Please also note that extended attributes are not transferred between filesystems per default.
Commands like cp or rsync have special options that need to be used. cp for example needs
`--preserve=xattr`.

Also extended attributes might have filesystem specific size limits. These might be further
limited by other mechanisms using them. SELinux for example uses extended attributes for storing
the files security context.

[^2]: xtaggers 自有的全局机制不能使用 ~ 速记来表示主目录。

依赖项

~7–17MB
~245K SLoC