查找同名(括号内内容除外)文件并删除较小文件的方法咨询
查找同名(括号内内容除外)文件并删除较小文件的方法咨询
嘿,我来帮你搞定这个需求!不管你习惯用终端命令行,还是喜欢图形界面工具,都有对应的办法,下面给你详细说说:
终端命令方案(适合喜欢用命令行的用户)
这个思路是先把文件名里括号及内部内容去掉,把相同基础名的文件归为一组,然后每组里只保留最大的文件,删除其他较小的。你可以按照下面的步骤操作:
- 打开终端,先进入目标文件夹(把路径换成你自己的文件夹路径):
cd /path/to/your/target/folder
- 复制粘贴下面的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
- 先运行脚本,看看输出的“准备删除”列表是不是你想要删除的文件。如果没问题,把脚本里的
echo "准备删除: $f ..."那行注释掉,然后取消# rm "$f"的注释,再次运行就会真正删除文件了。
GUI工具方案(适合喜欢图形界面的用户)
如果你不想用命令行,这些GUI工具可以帮你轻松完成:
- Duplicate Cleaner:这款工具支持自定义文件名匹配规则,你可以设置忽略括号内的内容来分组文件。操作大概是:
- 打开软件后添加目标文件夹
- 进入匹配规则设置,用正则表达式
\(.*\)来排除括号及内部内容 - 扫描完成后,软件会自动把同基础名的文件归为一组,你可以选择“保留最大文件”的选项,一键删除其余文件
- Windows系统可选SearchMyFiles:它能自定义文件名过滤条件,扫描后可以按文件大小排序,手动或批量删除较小的重复文件(按括号外名称分组)
- Mac系统可选Gemini 2:同样支持自定义匹配规则,识别出括号外名称相同的文件后,可自动保留最大的,删除其他冗余文件
备注:内容来源于stack exchange,提问作者Nuno Fonseca




