如何实现按下划线分隔匹配规则删除目录内非保留列表的文件
批量删除非匹配规则文件的实现方案
核心匹配规则对齐
严格按照要求的分隔逻辑判断保留/删除:
- 仅当文件名以保留列表中的某一项为前缀,且该前缀后紧跟英文下划线时,判定为需要保留的文件
- 举例:列表项
1只会匹配1_开头的所有文件,不会误匹配11_、12_等数字前缀更长的文件,和示例的判定结果完全对齐
执行前置操作(必做,防止误删)
- 确认两个核心路径:待清理的目标目录、保存保留列表的
keep_list.txt文件路径 - 先通过预览命令输出所有待删除文件的清单,逐行核对没有遗漏需要保留的文件后,再执行实际删除操作
预览待删除文件清单(不做实际删除)
把下面命令里的两个路径替换成你自己的实际路径后,执行即可输出所有符合删除条件的文件:
# 替换为实际路径 TARGET_DIR="/你的目标目录绝对路径" KEEP_LIST="/你的keep_list.txt文件绝对路径" find "$TARGET_DIR" -maxdepth 1 -type f | while read -r file; do filename=$(basename "$file") # 拼接保留列表的匹配规则:列表项后必须紧跟下划线 match_rule="^$(tr '\n' '|' < "$KEEP_LIST" | sed 's/|$//')_" if ! grep -qE "$match_rule" <<< "$filename"; then echo "待删除文件: $file" fi done
执行后的输出会和题目示例的判定完全一致:
- 被标记为待删除的文件:
2_c.gif、2_d.gif、2_.jpeg、23_.jpeg、4445_123.jpeg - 不在待删除列表、即会被保留的文件:
1_a.gif、1_b.gif、1_.jpeg、22_.jpeg、333_abc.gif
正式执行批量删除
等预览清单核对无误后,将上面的判断逻辑替换为实际删除命令即可:
# 替换为实际路径 TARGET_DIR="/你的目标目录绝对路径" KEEP_LIST="/你的keep_list.txt文件绝对路径" find "$TARGET_DIR" -maxdepth 1 -type f | while read -r file; do filename=$(basename "$file") match_rule="^$(tr '\n' '|' < "$KEEP_LIST" | sed 's/|$//')_" if ! grep -qE "$match_rule" <<< "$filename"; then echo "正在删除: $file" rm -- "$file" fi done
可调整的细节说明
- 命令里的
-maxdepth 1参数表示只处理目标目录下的第一层文件,不会递归扫描子目录;如果需要连子目录里的文件一起按规则清理,删掉这个参数即可 - 匹配逻辑是严格按“下划线分隔”判断的,不会出现长数字前缀误匹配短列表项的问题
内容的提问来源于stack exchange,提问作者dyna
相关产品推荐
相关产品推荐

