You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:54:24