1 个不稳定版本

0.3.0 2024年4月29日

#473文件系统

MIT 许可证

28KB
367

硬链接去重工具

hld 查找重复文件并将它们硬链接起来以节省磁盘空间。而且它速度很快!

以下是一个在现代(2017年)笔记本电脑上的示例会话

$ du -sh myproject ~/.m2
896M    myproject
912M    .m2
$ time hld -r -c ~/.m2 myproject
420.23 MB saved in the deduplication of 675 files
real 0.47
user 1.17
sys 0.22

420MB — 构建目录大小的46% — 仅用0.5秒就节省了 :-)

CI Status

功能

它默认与所有可用核心协同工作,并使用 BLAKE3 哈希函数,以确保非常快且碰撞率极低。

由于其缓存功能,它是高效地去除可能由某些自动化过程(例如maven构建)复制的文件的好方法。

用法

glob

hld 接收一组glob作为参数。glob用于查找去重候选文件。它们支持**表示法来遍历任意数量的目录。例如

  • hld "target/*.jar"target目录中直接去重所有jar文件;
  • hld "target/**/*.jar"target目录及其子目录中去重所有jar文件。

可以通过命令行传递多个glob以在多个目录和/或多个文件名模式上工作。例如:hld "target/*.jar" "images/**/*.png"

注意:引号很重要,可以避免shell进行glob展开。在大型目录的情况下,shell可能无法传递其中的所有文件。

缓存

除了上一章中提到的原始glob之外,还可以使用一些缓存的glob。它们的行为与原始glob相同,但它们的BLAKE3摘要值被保存以供以后重用。必须用于保证文件不会更改的情况。缓存的glob通过--cache-c选项传递。

例如:hld "target/*" --cache "stable/*" 将删除 targetstable 目录中的所有文件重复项,并缓存 stable 目录中文件的摘要。然后,在后续的 hld 调用中重用这些缓存的摘要,以加快执行速度。

在这种情况下,引号非常重要:没有它们,shell 将扩展通配符,并且只会缓存集合中的第一个文件。

可以使用 --cache-path 选项或 -C 来指定缓存路径,以便根据执行上下文处理多个缓存集。

可以使用 --clear-cache 选项清除缓存。

递归

--recursive-r 选项简化了处理某些目录中所有文件时的命令行使用。例如,以下两个命令严格等价:

hld -r -c ~/.m2 myproject
hld -c "$HOME/.m2/**/*" "myproject/**/*"

模拟运行

使用 --dry-run-n 选项可以防止 hld 修改磁盘上的任何内容,包括缓存。

例如:hld "target/*" --cache "stable/*" --dry-run 仅显示将删除多少文件以及可以节省多少空间,但实际上不执行任何操作。

日志级别

可以使用 --log-level-l 选项控制 hld 显示的输出量。它接受以下值,从最详细到最安静:tracedebuginfo(默认级别),warnerror

并行化

默认情况下,hld 最大化其工作的核心数,以便尽可能快地完成任务。使用 --parallel-j 选项可以更改并行运行的线程数。

例如,hld -j1 "myproject/*" 强制 hld 以单线程运行。

shell 自动完成

hld 可以为多个 shell(fish、zsh、bash 等)生成完成代码。只需使用带有 shell 类型的 --completion 选项运行它,并将生成的代码保存到适当的位置。例如,对于 fish:

hld --completion fish > ~/.config/fish/completions/hld.fish

完成通常在新的 shell 实例中激活,但也可以通过源文件来激活。再次以 fish 为例:

source ~/.config/fish/completions/hld.fish

安装

hld 目前仅可通过源代码获取。要安装它,您需要一个 Rust 安装hld 使用 rust stable 或更高版本进行编译。通常,hld 跟踪 Rust 编译器的最新稳定版本。

$ git clone https://github.com/glehmann/hld
...
$ cd hld
$ cargo install
...
$ $HOME/.cargo/bin/hld --version
hld 0.1.0

构建

您需要一个 Rust 安装hld 可使用 Rust 稳定版或更高版本进行编译。一般来说,hld 跟踪 Rust 编译器的最新稳定版本。

构建 hld

$ git clone https://github.com/glehmann/hld
...
$ cd hld
$ cargo build --release
...
$ ./target/release/hld --version
hld 0.1.0

测试

要运行完整的测试套件,请使用

$ cargo test
...
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

从仓库根目录。

发布

为了生成一个小巧且易于下载的可执行文件,只需进行一次发布构建,然后

$ strip target/release/hld
$ upx --ultra-brute target/release/hld

代码覆盖率

可以使用 kcov 计算代码覆盖率。确保 kcov 可执行文件在 PATH 中,然后运行

$ cargo test --features kcov -- --test-threads 1

报告可在 target/x86_64-unknown-linux-gnu/debug/coverage/index.html 中查看。

待办事项

  • 将缓存的和非缓存的文件中的摘要计算进行因式分解
  • 在符号链接时,我们保留哪个重复项?第一个?如果可能,从缓存中?

依赖项

~7–35MB
~563K SLoC