#tags #file #archive #file-metadata #directory #search #organize

app ftag

文件标记和搜索的 CLI 工具。有关更多信息,请参阅 README.md。

8 个版本

0.1.7 2024年6月22日
0.1.6 2024年4月26日
0.1.5 2024年2月25日
0.1.4 2024年1月7日
0.1.2 2023年12月3日

#957 in 命令行工具

Download history 104/week @ 2024-04-20 28/week @ 2024-04-27 1/week @ 2024-05-04 4/week @ 2024-05-18 1/week @ 2024-05-25 183/week @ 2024-06-22 8/week @ 2024-06-29 29/week @ 2024-07-06 40/week @ 2024-07-27

71 每月下载量

GPL-3.0-only

88KB
2K SLoC

ftag

ftag 是一个工具,允许您给文件添加标签和描述,然后根据标签查询和检索文件。这适用于像文档或图片这样的大型文件归档。

动机

目录树不是组织大型文件归档的好方法。目录树中目录的层次关系没有明确的逻辑。很容易出现深层目录树,这使得导航困难,并且难以找到所需的文件。 ftag 就是为此问题而编写的。将任意标签与文件关联是一种更灵活、更强大的文件组织方式。这允许您使用任何组合的标签搜索文件。这还让您拥有相对平坦的目录结构,并便于找到所需的文件。

虽然存在其他提供类似功能的工具,但 ftag 被设计得简单、可靠,适合长期归档。所有标签和元数据都存储在纯文本文件中。如果您移动或复制目录,包含该目录元数据和所有文件的纯文本文件也将随之移动或复制。由于 ftag 使用纯文本文件,因此非常适合长期归档,因为它让您拥有完全的数据所有权。

安装

Ftag 用 Rust 编写,可在 crates.io 上找到

cargo install ftag

或者您可以克隆此仓库并从那里安装

cargo install --path /path/to/ftag/repo/

用法

.ftag 文件包含所有元数据,即文件和目录的标签和描述。您可以在文件系统的任何位置放置一个 .ftag 文件,在您希望使用标签组织的任意目录中。每个 .ftag 文件应包含包含该 .ftag 文件的目录以及该目录直接子文件(即 .ftag 文件的同级文件)的元数据。它不应包含嵌套目录的元数据。嵌套目录应使用它们自己的 .ftag 文件。以这种方式保持元数据去中心化非常重要,这样当您移动或复制目录时,不会使元数据失效。

按照设计,ftag 永远不会修改 .ftag 文件。 .ftag 文件由用户创建,并由 ftag 消费和查询。作为一名 Emacs 用户,我编写了 这个主要模式,它提供自动完成、文件预览等功能,使创建 .ftag 文件变得简单(我没有为任何其他编辑器编写插件,但如果您喜欢 ftag,请随时贡献!)关于 .ftag 文件的更多细节将在后面讨论。

ftag 命令行工具

此查询将从工作目录递归遍历目录结构,并打印出标记为 "my-tag" 的文件列表。

ftag query my-tag

您可以通过查询和组合布尔表达式使用标签来变得复杂。用于组合布尔表达式的符号是:& 用于 AND,| 用于 OR,! 用于 NOT,以及 () 用于嵌套表达式。 -qquery 命令的别名。此命令将遍历目录并输出满足提供查询字符串的文件列表。这包括具有 "my-tag" 和 "other-tag" 的文件以及没有 "exclude-tag" 或同时具有 "tag1" 和 "tag2" 的文件。

ftag -q 'my-tag & other-tag & !exclude-tag | (tag1 & tag2)'

以下命令将遍历目录并确保所有 .ftag 文件都是有效的,即它们包含的元数据尚未因重命名、移动或删除文件而失效。

ftag check

以下命令将生成给定目录或文件的标签列表和描述。描述只是用户编写的用于描述文件的字符串。

ftag whatis path/to/my/file

如果您想修改元数据,edit 命令将在您的默认编辑器中打开给定目录中的 .ftag。如果没有提供目录,则假定当前工作目录。

ftag edit path/to/directory
# OR
ftag edit # Edit working directory

当您开始标记大量现有文件时,您可能无法一次性创建所有文件的元数据。查看未跟踪文件(即未分配任何元数据的文件)的列表通常很有用。此命令将生成未跟踪文件的列表。

ftag untracked

此命令将递归遍历目录并生成所有标签的列表。由于此命令递归遍历目录,如果目录不包含 .ftag 文件,则将其忽略。假设您不想跟踪该目录中的文件,并且它们不会被报告为未跟踪。

ftag tags

如果您想递归地查看当前工作目录中ftags跟踪的文件数量,请使用以下命令:

ftag count

大多数 ftag 子命令会从当前工作目录递归遍历目录,并生成您请求的输出。如果您希望从不同于当前工作目录的路径生成相同的输出,可以通过提供 --path | -p 标志来覆盖它。

ftag --path different/starting/directory <COMMAND>

Bash自动补全

在搜索文件时,您可能无法记住您应该搜索的确切标记。标记和命令的自动补全可以非常有帮助。要启用bash中的tab自动补全,请将以下内容添加到您的bash配置文件中:

complete -o default -C 'ftag --bash-complete --' ftag

具有TUI的交互模式

如果您真的不知道要查询哪些标记,交互模式可以非常有帮助。它会递归遍历所有目录,加载所有元数据,并使用TUI启动交互会话。您将看到一个所有跟踪文件的列表以及这些文件具有的所有标记的并集。您可以通过查看标记列表来找出要搜索的内容,或者开始键入类似 tag1 & tag.. 的内容,并让自动补全帮助您找到正确的标记。如果您按回车键,则文件列表将仅过滤到满足查询的文件。同样,您也应该看到标记集合缩小。您可以迭代地细化搜索,直到找到要查找的文件。如果您直接在REPL界面中键入文本,该文本被视为过滤器字符串。如果您以 / 开始,则该文本被视为命令。

您可以在交互模式下使用的命令有:

  • /reset 用于移除当前过滤器
  • /whatis <index> 用于查看当前列表中文件的标记和描述。您通过索引而不是名称或路径来选择文件。
  • /open <index> 用于使用默认应用程序打开具有给定索引的文件。
  • /quitexit 将退出交互模式。

如果您已经应用了过滤器,并正在查看文件列表,则您键入的下一个过滤器将附加到现有过滤器。例如,如果您输入过滤器 tag1 & tag2 并按回车键,该过滤器将应用并显示更小的文件列表。如果您然后输入 | tag3 并按回车键,它将被附加到现有过滤器,结果为 (tag1 & tag2) | tag3。这在逐步缩小过滤器以找到所需的文件时非常有用。

.ftag 文件

.ftag 文件的格式应该是一个标题,然后是标题下的内容,然后是另一个标题,依此类推,直到文件末尾。支持的头包括:用于描述的 desc,用于标记的 tags,以及用于文件路径和通配符的 path。标题应在单独的行上,用 [] 括号包围,类似于 TOML 或 INI 文件。因此,一个典型的 .ftag 文件可能看起来像这样:

[desc]
This is the description of this directory.
The description can span multiple lines and paragraphs.

[tags]
tag1 tag2 tag3 tag4
tag5
tag6

[path]
my_file_1.pdf
[tags]
ftag1 pdf document

[path]
my_file_2.pdf
[desc]
This is my second file.
[tags]
ftag2 pdf document

位于 .ftag 文件开头的标签和描述性标题与该目录本身相关联。位于 path 标题之后的标签和描述性标题与特定文件或通配符相关联。path 不需要是特定文件。相反,它可以是通配符,在这种情况下,提供的标签和描述将应用于所有匹配通配符的文件。通配符可以用于在您想将相同的一组标签关联到许多文件时避免重复。因此,多个通配符可以匹配单个文件。与该文件关联的标签将是匹配文件的通配符所关联的标签的并集。描述将连接起来。

图形模式

理论上,可以使用标签来渲染 zettelkasten 风格的图形,其中文件表示为节点,任何两个共享标签的文件都通过边连接。结合过滤功能,这可以是一种强大的、直观的搜索大量文件的方法。这尚未实现。目前,这只是一个正在形成中的想法。

依赖关系

~8–18MB
~238K SLoC