最可靠方法是用 find + md5sum 按哈希值分组:先 find /path -type f ! -size 0 -print0 | xargs -0 md5sum 2>/dev/null | sort,再 awk 分组输出重复文件列表。

用 find + md5sum 找出相同内容的文件
Linux 下没有内置命令直接“查重复文件”,本质是比对文件内容哈希值。最可靠的方式是先用 find 收集目标路径下的所有常规文件,再对每个文件计算 md5sum,最后按哈希值分组——相同哈希即大概率内容一致(MD5 碰撞极罕见,日常足够)。
常见错误是直接对目录或符号链接运行 md5sum,会报错或结果无效;必须加 -type f 过滤。
- 基础命令链:
find /path -type f -exec md5sum {} \; | sort—— 输出已排序,但没去重,需人工扫 - 更实用的是分组统计:
find /path -type f -exec md5sum {} \; | sort | awk '{print $1}' | uniq -d,只列出重复的 MD5 值 - 若要看到具体哪些文件重复,用:
find /path -type f -exec md5sum {} \; | sort | awk '{if ($1 == prev) {print prev_file; print $0} else {prev = $1; prev_file = $0}}'
避免误判:跳过空文件、设备文件和权限不足的文件
md5sum 遇到空文件会输出全 0 的哈希(d41d8cd98f00b204e9800998ecf8427e),大量空文件会导致假阳性;遇到 /dev/xxx 或无读权限文件会报错并中断管道流,影响结果完整性。
- 跳过空文件:
find /path -type f ! -size 0 - 跳过设备/特殊文件:
find /path -type f -not -name ".*" -not -path "/dev/*" -not -path "/proc/*" -not -path "/sys/*" - 静默错误(不中断):
find ... -exec md5sum {} \; 2>/dev/null - 组合起来更稳妥:
find /path -type f ! -size 0 -not -path "/dev/*" -not -path "/proc/*" -not -path "/sys/*" -exec md5sum {} \; 2>/dev/null | sort
提高效率:用 xargs 替代 exec,大目录下快 3–5 倍
-exec cmd {} \; 对每个文件调用一次 md5sum,开销大;xargs 可批量传入多个文件路径给单次 md5sum 调用,减少进程创建次数。
- 正确写法:
find /path -type f ! -size 0 -print0 | xargs -0 md5sum 2>/dev/null | sort - 注意必须用
-print0和-0处理含空格或换行符的路径,否则会出错 - 如果路径含中文或特殊字符,不用
-print0会导致md5sum报No such file - 某些老系统
xargs不支持-0,可改用find ... -exec md5sum {} +(+ 表示批量)
导出重复组为可读格式:一行一个重复文件列表
单纯看哈希值无法知道哪几个文件互为重复。下面这个脚本片段能把相同 MD5 的文件归成一组,每组换行分隔,方便后续处理(如删软链、交互确认删除):
find /path -type f ! -size 0 -print0 | xargs -0 md5sum 2>/dev/null | sort | awk '{
if ($1 == prev) {
printf "%s\n", $0
} else {
if (NR > 1) print ""
printf "%s\n", $0
prev = $1
}
}' | sed '/^$/d'
它输出类似:
1a2b3c... ./a.txt 1a2b3c... ./b.txt 4d5e6f... ./x.log 4d5e6f... ./backup/x.log
最后一行 sed '/^$/d' 是为了删掉开头可能的空行——这个细节容易被忽略,导致解析时多出空组。











