You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何对比两个目录,查找同名同大小同类型重复文件并删除?

嘿,我日常处理文件整理的时候经常碰到这类需求,给你整理了几个实用的方案,从一键工具到自定义脚本都有,你可以根据自己的场景选:

方案1:用fdupes工具(最省心的命令行工具)

这是我最常用的工具,专门用来查找和删除重复文件,支持按文件名、大小、内容(校验和)来匹配,完全符合你的需求。

  • 先安装工具:

    • Debian/Ubuntu 系:sudo apt update && sudo apt install fdupes
    • CentOS/RHEL 系:sudo dnf install fdupes
    • macOS(用Homebrew):brew install fdupes
  • 先预览重复文件(强烈建议先做这一步,确认无误再删除):

    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
  • 先预览重复列表(不删除,生成报告):

    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 "重复文件清理完成!"
  • 使用方法:
    1. 将脚本保存为remove_duplicates.sh
    2. 赋予执行权限:chmod +x remove_duplicates.sh
    3. 执行脚本:./remove_duplicates.sh dir1 dir2(dir1是保留目录,dir2是要删除重复的目录)
重要提醒

不管用哪种方法,强烈建议先备份目录或者先预览要删除的文件列表,避免误删重要文件!比如用fdupes只预览不删除,或者脚本里先注释掉rm "$target_file",换成echo "将删除: $target_file"来确认。

内容的提问来源于stack exchange,提问作者fatemeh ghanbari

火山引擎 最新活动