你是想在 Linux 下做存储优化,把重复的文件转换成硬链接来节省磁盘空间,对吧?
这种方法在照片、备份文件、编译产物等大量重复文件场景非常有效,因为硬链接共享相同的 inode 数据,只占用一次磁盘存储。
1. 原理
- 硬链接(hard link)是同一个文件的另一个名字,多个名字指向同一个 inode。
- 删除一个硬链接只是减少引用计数,只有引用数为 0 时,文件数据才会被删除。
- 因为 inode 相同,所以文件内容完全一致,不会占用额外空间。
- 限制:
- 必须在同一个文件系统(同一个分区)内。
- 硬链接不能用于目录(除非特殊权限)。
2. 工具推荐
方法 1:rdfind(推荐,自动化高)
# 安装(Debian/Ubuntu)
sudo apt install rdfind
# 安装(CentOS/RHEL)
sudo yum install rdfind
# 查找重复文件并转换为硬链接
rdfind -makehardlinks true /path/to/search- 默认会递归扫描目录,检测重复文件,替换成硬链接。
- 也可以先测试:
rdfind /path/to/search方法 2:fdupes(简单)
# 安装
sudo apt install fdupes
# 查找重复文件
fdupes -r /path/to/search
# 查找并替换为硬链接
fdupes -rL /path/to/search方法 3:手动 find + md5sum + ln
如果你不想安装额外工具,可以用 Bash 脚本:
cd /path/to/search
find . -type f -exec md5sum {} + | sort | awk '{
if(seen[$1]) {
system("ln -f \"" $2 "\" \"" seen[$1] "\"")
} else {
seen[$1]=$2
}
}'- 会用第一个发现的文件作为原始文件,后面重复的用硬链接替代。
3. 注意事项
- 先备份:硬链接是不可逆的,替换后两个文件名共享内容,改一个会影响另一个。
- 确保在同一文件系统:跨分区无法建立硬链接。
- 适用于静态文件:如备份、图片、已编译的包;不建议用于会频繁修改的文件。
如果你愿意,我可以帮你写一个安全的批量扫描+硬链接替换脚本,带预览模式,先显示将会替换的文件,再确认执行。
这样就可以避免误替换重要文件。
你是要我帮你直接写这个安全版脚本吗?这样可以一步到位。
作者:那时一个人
















