1 个不稳定版本
0.3.0 | 2024年4月29日 |
---|
#473 在 文件系统
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秒就节省了 :-)
功能
它默认与所有可用核心协同工作,并使用 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/*"
将删除 target
和 stable
目录中的所有文件重复项,并缓存 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
显示的输出量。它接受以下值,从最详细到最安静:trace
,debug
,info(默认级别),
warn
,error
。
并行化
默认情况下,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