如何编写Bash脚本遍历test1、test2目录查找并删除重复文件?
我来帮你搞定这个需求!要找出test1和test2里文件名和文件大小都完全一致的重复文件,然后删掉其中一份,下面是一个实用的Bash脚本方案,我会一步步给你拆解清楚。
重要提示
在执行删除操作前,强烈建议先备份两个目录里的文件,或者先把脚本里的rm命令换成echo,先预览要删除的文件列表,确认无误后再执行实际删除操作——毕竟数据安全第一位!
解决方案脚本
#!/bin/bash # 定义要检查的两个目录,可根据实际路径修改 DIR1="test1" DIR2="test2" # 先检查目录是否存在,避免路径错误 if [ ! -d "$DIR1" ] || [ ! -d "$DIR2" ]; then echo "错误:指定的目录不存在,请检查路径!" exit 1 fi # 遍历test1中的所有文件 for file1 in "$DIR1"/*; do # 只处理普通文件,跳过子目录 if [ -f "$file1" ]; then # 提取当前文件的文件名 filename=$(basename "$file1") # 拼接test2中对应文件名的路径 file2="$DIR2/$filename" # 检查test2中是否存在同名的普通文件 if [ -f "$file2" ]; then # 获取两个文件的字节大小 size1=$(stat -c %s "$file1") size2=$(stat -c %s "$file2") # 对比文件名和大小是否都匹配 if [ "$size1" -eq "$size2" ]; then echo "发现重复文件:$file1 ↔ $file2" # 这里选择删除test2中的重复文件,要删test1的话把$file2换成$file1即可 rm -v "$file2" # 预览模式:把上面的rm换成echo,就会打印要删除的文件而不执行删除 # echo "将要删除:$file2" fi fi fi done echo "重复文件清理完成!"
脚本详细解释
- 目录配置:开头的
DIR1和DIR2变量用来指定你要检查的两个目录,直接修改成你的实际路径就行。 - 目录校验:脚本先判断两个目录是否存在,避免因为手滑输错路径导致后续白忙活。
- 遍历与筛选:用
for循环扫test1下的所有内容,通过-f判断是不是普通文件,跳过子目录(如果有的话)。 - 同名匹配:提取
test1里文件的纯文件名,然后去test2里找有没有一模一样的文件名。 - 大小对比:用
stat -c %s命令获取文件的字节数(这个是最准确的大小统计方式),对比两个文件的大小是否完全一致。 - 删除逻辑:如果文件名和大小都匹配,就删除
test2里的那份重复文件——你要是想删test1里的,把脚本里的$file2换成$file1就行。
进阶补充(可选)
如果需要双向检查(比如test2里有个文件test1也有,但刚才的脚本只扫了test1到test2的匹配),可以再复制一遍循环,把DIR1和DIR2互换,这样就能覆盖所有双向重复的情况。
内容的提问来源于stack exchange,提问作者fatemeh ghanbari
相关产品推荐
相关产品推荐

