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

查找同名(括号内内容除外)文件并删除较小文件的方法咨询

查找同名(括号内内容除外)文件并删除较小文件的方法咨询

嘿,我来帮你搞定这个需求!不管你习惯用终端命令行,还是喜欢图形界面工具,都有对应的办法,下面给你详细说说:

终端命令方案(适合喜欢用命令行的用户)

这个思路是先把文件名里括号及内部内容去掉,把相同基础名的文件归为一组,然后每组里只保留最大的文件,删除其他较小的。你可以按照下面的步骤操作:

  1. 打开终端,先进入目标文件夹(把路径换成你自己的文件夹路径):
cd /path/to/your/target/folder
  1. 复制粘贴下面的bash脚本到终端运行(注意:脚本默认是模拟删除,先看输出确认没问题再改成真正删除):
#!/bin/bash

# 只处理当前目录下的普通文件,跳过文件夹
for file in *; do
    [[ -f "$file" ]] || continue

    # 提取括号前的基础文件名,比如将"Addams Family, The (USA).zip"处理成"Addams Family, The"
    base_name=$(echo "$file" | sed -E 's/\s*\(.*\)//')

    # 将同基础名的文件归类到同一组
    if [[ -z "${groups[$base_name]}" ]]; then
        groups[$base_name]="$file"
    else
        groups[$base_name]="${groups[$base_name]} $file"
    fi
done

# 遍历每个文件组,删除较小的文件
for base in "${!groups[@]}"; do
    files=(${groups[$base]})
    # 如果组里只有一个文件,直接跳过
    [[ ${#files[@]} -le 1 ]] && continue

    # 找出组里最大的文件
    max_size=0
    max_file=""
    for f in "${files[@]}"; do
        current_size=$(stat -c%s "$f")
        if (( current_size > max_size )); then
            max_size=$current_size
            max_file="$f"
        fi
    done

    # 输出要删除的文件(确认后再替换成rm命令)
    echo "=== 处理基础文件名: $base ==="
    for f in "${files[@]}"; do
        if [[ "$f" != "$max_file" ]]; then
            file_size=$(stat -c%s "$f")
            echo "准备删除: $f (大小: $file_size 字节)"
            # 确认无误后,把上面的echo注释掉,取消下面rm的注释
            # rm "$f"
        fi
    done
done
  1. 先运行脚本,看看输出的“准备删除”列表是不是你想要删除的文件。如果没问题,把脚本里的echo "准备删除: $f ..."那行注释掉,然后取消# rm "$f"的注释,再次运行就会真正删除文件了。

GUI工具方案(适合喜欢图形界面的用户)

如果你不想用命令行,这些GUI工具可以帮你轻松完成:

  • Duplicate Cleaner:这款工具支持自定义文件名匹配规则,你可以设置忽略括号内的内容来分组文件。操作大概是:
    • 打开软件后添加目标文件夹
    • 进入匹配规则设置,用正则表达式\(.*\)来排除括号及内部内容
    • 扫描完成后,软件会自动把同基础名的文件归为一组,你可以选择“保留最大文件”的选项,一键删除其余文件
  • Windows系统可选SearchMyFiles:它能自定义文件名过滤条件,扫描后可以按文件大小排序,手动或批量删除较小的重复文件(按括号外名称分组)
  • Mac系统可选Gemini 2:同样支持自定义匹配规则,识别出括号外名称相同的文件后,可自动保留最大的,删除其他冗余文件

备注:内容来源于stack exchange,提问作者Nuno Fonseca

火山引擎 最新活动