如何在Unix目录中依据文件名子串删除重复文件
按文件名子串分组去重实现方案
你之前使用的md5sum方案是基于文件内容一致性判断重复,和你需要的按文件名特定子串分组去重的规则不匹配,因此无法得到预期结果。
步骤1:预览待删除文件(强制先执行确认,避免误删)
# 通用预览命令:自动提取第一个下划线之后的内容作为分组键,同组除第一个文件外都会被列为待删文件 find . -type f -name "*.DAT" | awk '{ # 复制原文件名到临时变量t t=$0 # 去掉第一个下划线及之前的前缀,剩下的就是分组匹配子串 sub(/^[^_]*_/, "", t) # 同组第一个文件不会输出,后续重复的直接打印 if(seen[t]++) print $0 }'
执行后输出的所有文件就是待删除的列表,确认和你的预期一致后再执行删除操作。
步骤2:执行删除
普通场景(文件名无空格/特殊字符)
find . -type f -name "*.DAT" | awk '{t=$0;sub(/^[^_]*_/, "", t);if(seen[t]++) print $0}' | xargs rm -f
兼容特殊字符场景(文件名含空格、换行等)
find . -type f -name "*.DAT" -print0 | awk -v RS='\0' '{t=$0;sub(/^[^_]*_/, "", t);if(seen[t]++) printf "%s\0", $0}' | xargs -0 rm -f
规则调整说明
如果后续你需要修改分组子串的匹配规则,只需要调整awk中t变量的提取逻辑即可,比如要固定取GRUP开头到.DAT结尾的部分作为分组键,可把sub语句替换为match($0, /GRUP.*\.DAT$/, arr); t=arr[0]即可。
内容的提问来源于stack exchange,提问作者SAVAN DISAWAL
相关产品推荐
相关产品推荐

