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 每月下载量
56KB
1K SLoC
Y(a)NK
Y(a)nk 是一个简单的命令行工具,它实现了在终端中我一直想要的基本功能。它允许您从目录之间复制和粘贴文件,而无需输入完整的路径。这是一个为我制作的一个非常简单的工具,但我认为它对其他人也可能很有用。
因此,本质上,您可以进入一个目录,就像使用GUI一样,复制一个文件或目录。然后您可以转到另一个目录并粘贴它。就这么简单。
无需 cp
或 mv
。只需 yank
和 paste
。
安装
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 |
因此,当你粘贴时,它基本上会读取整个文件,存储在临时内存中,然后写入当前目录。所以它并不是真正的 cp
或 mv
,因为它实际上并没有移动文件。它只是读取和写入。
Ynk 可以做到 cp
做不到的事情
- 它可以尊重你的
.gitignore
文件。所以如果你有被 git 忽略的文件或目录,它将不会被复制。 - 拥有一个一致的文件和目录存储库,你可以随时列出、删除和粘贴它们。
- 本质上,它是一个文件和目录的剪贴板。
- 它很快。它使用多个线程进行 IO 操作,所以非常快。
- 特别适用于处理具有依赖项的非常大的项目,例如
node_modules
或target
目录。 - 你可以将多个
cp
命令合并为一个。你可以复制多个文件和目录,然后一次性粘贴它们,实际上这是使用 ynk 的推荐方法。 - 嘿,它是 Rust。所以它既快又安全。
- 本质上,它是一个终端中的图形界面功能。
粘贴呢?
粘贴是这个工具的核心。索引的文件和目录存储在数据库中。所以当你粘贴时,它会从数据库中读取文件的精确路径,然后读取文件,并将其写入当前目录。如果读取的路径无效,它将抛出错误。
IO 操作本身由多个线程驱动,几乎像线程池。所以它非常快。每个文件 IO 都在单独的线程中完成。所以它非常快。文件的读取和写入由 tokio
的 fs 模块以块的形式完成,保持安全性和速度。
文件树使用 walkdir
遍历,同时确保尊重 .gitignore
文件。所有这些都在一个线程池中并行执行,并使用内存中的静态缓存。
我需要安装什么数据库?
你不需要安装任何数据库。
数据库是一个简单的 SQLite3 数据库,其驱动程序已嵌入到二进制文件中。所以你不需要安装任何其他东西。这使得二进制文件成为一个单一文件,并使其易于安装和使用。
数据库功能都封装在单独的模块中,因此如果需要,可以轻松更换数据库。
待办事项
- 添加
--force
选项以覆盖文件和目录。 - 添加
--target
选项以在特定目录中粘贴文件和目录。(版本 0.1.2) - 添加配置文件支持。
- 添加永久存储选项。
- 更明确的错误处理。
许可证
本项目采用 MIT 许可证 - 请参阅 LICENSE 文件以获取详细信息。
贡献
ynk 是一个开源项目,欢迎贡献。您可以通过提交问题、修复错误、建议功能等方式进行贡献。您可以在 这里 阅读贡献指南。
我刚开始接触Rust,如果您发现任何错误或有任何建议,请提交一个问题。我很乐意听到您的反馈。
感谢尝试使用ynk!
依赖项
~44–61MB
~1M SLoC