使用fdupes或find+md5sum识别并处理内容重复文件,先备份、过滤非目标文件,再通过删除或转硬链接实现安全去重,推荐fdupes交互操作与hardlink节省空间。

Linux 上做文件去重,核心是识别内容相同但路径/名称不同的文件,并安全地保留一份、删除或软链接其余。不看文件名、大小,只看内容是否一致——这才是真实去重。
用 fdupes 快速找并处理重复文件
fdupes 是最常用、可靠的去重工具,按文件内容(MD5 + 比对)识别重复项,支持交互式删除或自动处理。
- 安装:Ubuntu/Debian 用 sudo apt install fdupes;CentOS/RHEL 用 sudo yum install fdupes(或 dnf)
- 扫描当前目录及子目录所有普通文件:fdupes -r .
- 显示重复组并交互式选择保留哪份(其余删除):fdupes -r -d . → 每组出现时输入要保留的编号(如 1),回车即删其余
- 直接删除所有重复项(只留每组第一个):fdupes -r -f . | xargs -I {} rm -v "{}"(-f 输出唯一文件,即每组仅首行;慎用,建议先试运行不带 rm 的版本)
用 find + md5sum 手动排查(适合脚本集成或无 root 环境)
当不能装 fdupes,或需嵌入自动化流程时,可用 find 配合校验和实现轻量去重逻辑。
- 生成所有文件的 MD5 和路径:find /path/to/dir -type f -exec md5sum {} \; | sort
- 提取重复 MD5 块:find /path/to/dir -type f -exec md5sum {} \; | sort | awk '{if ($1 == prev) print; prev=$1}'
- 更实用的一行去重清理(保留每组第一个,其余加 .dup 后缀):
find /data/docs -type f -exec md5sum {} \; | sort | awk 'NR==FNR{a[$1]=$2;next} $1 in a{print "mv \"" $2 "\" \"" $2 ".dup\""}' - - | sh -x
(说明:先建哈希→路径映射,再对重复哈希输出重命名命令,最后执行;-x 可预览操作)
去重前必做的三件事
真实场景中,误删代价高,务必提前验证和防护:
-
确认文件类型:避免对日志、数据库文件、正在写的临时文件去重(加 -not -name "*.log" -not -path "/proc/*" 过滤)
-
备份关键目录:至少用 cp -al 做硬链接快照(节省空间且秒级恢复):cp -al docs docs-backup-$(date +%F)
-
检查硬链接数:用 ls -li 看 inode 号,相同表示已是硬链接——这类无需去重,它们本就是同一份数据的不同入口
进阶技巧:用 hardlink 把重复内容转为硬链接(省空间不丢文件)
比起删文件,把重复内容统一指向同一个 inode 更安全、可逆,尤其适合备份目录、静态资源库。
- 安装:sudo apt install hardlink(Debian/Ubuntu)
- 在目标目录下将内容相同的文件转为硬链接:hardlink -t /path/to/dir
- 效果:原文件名、权限、时间戳全保留,磁盘占用降为 1 份;注意:仅限同一文件系统内生效
基本上就这些。真实场景里,先用 fdupes -r -d 交互确认,再考虑 hardlink 自动优化,比写一堆 find 脚本更稳更快。关键是别跳过备份和过滤——去重不是目的,释放空间且不出错才是。
以上就是Linux 上怎么做文件去重?真实场景示例的详细内容,更多请关注php中文网其它相关文章!