如何对比两个目录,查找同名同大小同类型重复文件并删除?
嘿,我日常处理文件整理的时候经常碰到这类需求,给你整理了几个实用的方案,从一键工具到自定义脚本都有,你可以根据自己的场景选:
方案1:用
fdupes工具(最省心的命令行工具) 这是我最常用的工具,专门用来查找和删除重复文件,支持按文件名、大小、内容(校验和)来匹配,完全符合你的需求。
先安装工具:
- Debian/Ubuntu 系:
sudo apt update && sudo apt install fdupes - CentOS/RHEL 系:
sudo dnf install fdupes - macOS(用Homebrew):
brew install fdupes
- Debian/Ubuntu 系:
先预览重复文件(强烈建议先做这一步,确认无误再删除):
fdupes -r dir1 dir2参数
-r表示递归遍历子目录,命令会列出所有在两个目录中重复的文件(匹配文件名、大小、内容)。删除其中一个目录的重复文件:
如果要保留dir1里的文件,删除dir2中的重复项,可以用:fdupes -r -d -N dir1 dir2-d:启用删除模式-N:无交互自动保留第一个出现的文件(也就是dir1里的),删除后续的重复文件(dir2里的)
如果不想自动处理,去掉-N,工具会让你手动选择保留哪个文件。
方案2:用
rdfind工具(更智能的重复检测) rdfind会通过文件内容的校验和来识别重复,还能自动判断保留哪个(默认保留最早创建的文件),适合需要批量自动处理的场景。
安装工具:
- Debian/Ubuntu 系:
sudo apt install rdfind - CentOS/RHEL 系:
sudo dnf install rdfind - macOS:
brew install rdfind
- Debian/Ubuntu 系:
先预览重复列表(不删除,生成报告):
rdfind dir1 dir2执行后会生成一个
results.txt文件,里面详细列出了所有重复文件的路径,以及标记出要删除的文件(标记为DUPTYPE_FIRST_OCCURRENCE的是保留的,其他是重复项)。自动删除重复文件:
rdfind -deleteduplicates true dir1 dir2这个命令会自动删除重复文件,只保留每个重复组里的第一个文件(最早创建的)。
方案3:自定义Bash脚本(精确控制匹配规则)
如果你需要更灵活的匹配逻辑(比如只按文件名+大小匹配,忽略内容),可以自己写个脚本:
#!/bin/bash # 检查参数是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <保留目录> <要清理的目录>" exit 1 fi SOURCE_DIR="$1" TARGET_DIR="$2" # 检查目录是否存在 if [ ! -d "$SOURCE_DIR" ] || [ ! -d "$TARGET_DIR" ]; then echo "错误:指定的目录不存在!" exit 1 fi # 遍历目标目录的所有文件,对比源目录的文件 find "$TARGET_DIR" -type f | while read -r target_file; do # 获取相对路径,用来匹配源目录中的文件 rel_path="${target_file#$TARGET_DIR/}" source_file="$SOURCE_DIR/$rel_path" # 检查源文件是否存在,并且文件名、大小一致 if [ -f "$source_file" ]; then source_size=$(stat -c "%s" "$source_file") target_size=$(stat -c "%s" "$target_file") if [ "$source_size" -eq "$target_size" ]; then # 可选:如果需要校验内容,添加MD5对比 # source_md5=$(md5sum "$source_file" | awk '{print $1}') # target_md5=$(md5sum "$target_file" | awk '{print $1}') # if [ "$source_md5" = "$target_md5" ]; then echo "删除重复文件: $target_file" rm "$target_file" # fi fi fi done echo "重复文件清理完成!"
- 使用方法:
- 将脚本保存为
remove_duplicates.sh - 赋予执行权限:
chmod +x remove_duplicates.sh - 执行脚本:
./remove_duplicates.sh dir1 dir2(dir1是保留目录,dir2是要删除重复的目录)
- 将脚本保存为
重要提醒
不管用哪种方法,强烈建议先备份目录或者先预览要删除的文件列表,避免误删重要文件!比如用fdupes只预览不删除,或者脚本里先注释掉rm "$target_file",换成echo "将删除: $target_file"来确认。
内容的提问来源于stack exchange,提问作者fatemeh ghanbari




