你是想在 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. 注意事项

  1. 先备份:硬链接是不可逆的,替换后两个文件名共享内容,改一个会影响另一个。
  2. 确保在同一文件系统:跨分区无法建立硬链接。
  3. 适用于静态文件:如备份、图片、已编译的包;不建议用于会频繁修改的文件。

如果你愿意,我可以帮你写一个安全的批量扫描+硬链接替换脚本,带预览模式,先显示将会替换的文件,再确认执行。
这样就可以避免误替换重要文件。

你是要我帮你直接写这个安全版脚本吗?这样可以一步到位。

作者:那时一个人