14个版本

0.3.1 2024年4月14日
0.3.0 2024年4月7日
0.2.6 2024年2月10日
0.2.2 2024年1月28日
0.1.9 2024年1月24日

#276文件系统

24 每月下载量

MIT 协议

56KB
1K SLoC

Y(a)NK

Y(a)nk 是一个简单的命令行工具,它实现了在终端中我一直想要的基本功能。它允许您从目录之间复制和粘贴文件,而无需输入完整的路径。这是一个为我制作的一个非常简单的工具,但我认为它对其他人也可能很有用。

因此,本质上,您可以进入一个目录,就像使用GUI一样,复制一个文件或目录。然后您可以转到另一个目录并粘贴它。就这么简单。

无需 cpmv。只需 yankpaste

安装

Unix

如果您在Linux或Macos等Unix平台上,ynk对其有第一类和经过测试的支持。安装它的最佳方式是使用cargo。如果您没有安装cargo,可以从这里安装。

安装cargo后,您可以通过运行以下命令来安装ynk:

cargo install ynk

Windows

在Windows上安装ynk的最佳方式是使用cargo。

cargo install ynk

此外,我无法在Windows上进行测试,所以如果您发现任何错误,请打开一个问题。

使用

复制

要复制文件或目录,您可以使用 add 命令。它接受一个参数,即您想要复制的一个或多个文件或目录的路径。

yank add README.md

您不需要提供任何参数。这是因为它本质上不执行任何I/O操作。它只是将文件或目录的路径存储在数据库中。因此,它非常快。

它检查路径的完整性,将其转换为合适的格式,然后存储在数据库中。如果路径无效,它将抛出一个错误。

粘贴

粘贴也很简单。只需使用 paste 命令。这里您可以调整要复制的内容。您可以使用以下选项进行操作:

警告:粘贴会粘贴存储中的所有文件和目录。如果您想指定特定条目,请使用 ynk list,获取条目索引,然后使用 ynk paste -r <索引>,或者直接使用 ynk pop

ynk paste [-n|--no-ignore] [--hidden] [-s|--strict] [-f|--force] [--dry-run] [-r|--range <start..end>] [--id <id1,id2>] [-d|--delete] FOLDER_NAME

在传递选项之前,请注意,paste 命令针对 IO 任务进行了高度优化。从读取目录结构(遍历目录树)到读取和写入文件。它使用了大量线程来完成这些任务。因此,它非常快。

此外,它还默认尊重您的 .gitignore 文件,不会复制隐藏文件或目录。要了解如何调整此设置,请阅读下面的选项。

  • -n--no-ignore:这将使其忽略 .gitignore 文件并复制所有文件和目录。
  • -a--all:这将使其复制所有文件和目录,包括隐藏文件和目录。
  • -s--strict:这将确保报告任何和所有的 IO 错误。默认情况下,它将忽略任何 IO 错误并继续执行操作。
  • -f--force待定 目前,这没有任何作用。但将来,这将使它可以覆盖已经存在的任何文件或目录。
  • --dry-run:这将使其不会实际复制任何文件或目录。它只会打印出将要执行的操作。
  • -r--range:这将使其只粘贴一组文件和目录。这在您只想粘贴大量列表中的几个文件和目录时非常有用。您可以使用以下格式指定范围:start:end。它还不是最聪明的,所以请确保您正确指定范围。如果范围无效,它将引发错误。
  • -d--delete:这将使其在粘贴后从数据库中删除文件和目录。而不是从磁盘上删除。
  • --preserve:这将保留文件名的自然路径并使用它。例如,如果您使用 ynk add ../README.md --preserve,当您粘贴它时,它实际上会将 ../ 添加到路径并在父目录中粘贴。
  • --size:这将打印出正在列出的文件和目录的大小,只能与 list 命令一起使用。
  • --id:这将只粘贴指定 id 的文件。覆盖范围选项。

弹出

这是最常见的情况。您可以弹出最后复制的文件或目录。这将将其从数据库中删除,并将所有文件和目录粘贴到当前目录中。pop 命令除了 --range 选项外,还具有与 paste 命令相同的选项。

yank pop [-n|--no-ignore] [--hidden] [-s|--strict] [-f|--force] [--dry-run] [-d|--delete] FOLDER_NAME

列出

您可以列出数据库中 ynk 索引的所有文件和目录。

yank list

删除

您可以删除数据库中的文件或目录。

yank delete README.md

所以这只是个花哨的 cp 吗?

嗯,是的,也不是。目前,它只拥有一个数据库,可以抽象地存储名称和完整路径。所以你可以这样做

yank add README.md

这将在数据库中存储类似以下内容

id name path created_at
1 README.md /home/user/README.md 2020-01-01 00:00:00

因此,当你粘贴时,它基本上会读取整个文件,存储在临时内存中,然后写入当前目录。所以它并不是真正的 cpmv,因为它实际上并没有移动文件。它只是读取和写入。

Ynk 可以做到 cp 做不到的事情

  • 它可以尊重你的 .gitignore 文件。所以如果你有被 git 忽略的文件或目录,它将不会被复制。
  • 拥有一个一致的文件和目录存储库,你可以随时列出、删除和粘贴它们。
  • 本质上,它是一个文件和目录的剪贴板。
  • 它很快。它使用多个线程进行 IO 操作,所以非常快。
  • 特别适用于处理具有依赖项的非常大的项目,例如 node_modulestarget 目录。
  • 你可以将多个 cp 命令合并为一个。你可以复制多个文件和目录,然后一次性粘贴它们,实际上这是使用 ynk 的推荐方法。
  • 嘿,它是 Rust。所以它既快又安全。
  • 本质上,它是一个终端中的图形界面功能。

粘贴呢?

粘贴是这个工具的核心。索引的文件和目录存储在数据库中。所以当你粘贴时,它会从数据库中读取文件的精确路径,然后读取文件,并将其写入当前目录。如果读取的路径无效,它将抛出错误。

IO 操作本身由多个线程驱动,几乎像线程池。所以它非常快。每个文件 IO 都在单独的线程中完成。所以它非常快。文件的读取和写入由 tokio 的 fs 模块以块的形式完成,保持安全性和速度。

文件树使用 walkdir 遍历,同时确保尊重 .gitignore 文件。所有这些都在一个线程池中并行执行,并使用内存中的静态缓存。

我需要安装什么数据库?

你不需要安装任何数据库。

数据库是一个简单的 SQLite3 数据库,其驱动程序已嵌入到二进制文件中。所以你不需要安装任何其他东西。这使得二进制文件成为一个单一文件,并使其易于安装和使用。

数据库功能都封装在单独的模块中,因此如果需要,可以轻松更换数据库。

待办事项

  • 添加 --force 选项以覆盖文件和目录。
  • 添加 --target 选项以在特定目录中粘贴文件和目录。(版本 0.1.2)
  • 添加配置文件支持。
  • 添加永久存储选项。
  • 更明确的错误处理。

许可证

本项目采用 MIT 许可证 - 请参阅 LICENSE 文件以获取详细信息。

贡献

ynk 是一个开源项目,欢迎贡献。您可以通过提交问题、修复错误、建议功能等方式进行贡献。您可以在 这里 阅读贡献指南。

我刚开始接触Rust,如果您发现任何错误或有任何建议,请提交一个问题。我很乐意听到您的反馈。

感谢尝试使用ynk!

依赖项

~44–61MB
~1M SLoC