如何简化Bash中查找并删除非指定类型文件的命令语法?
简化批量删除非媒体文件的find命令
你的思路是对的,extglob确实能大幅简化命令,下面是具体实现方法,同时补充另一种不依赖shell扩展的通用方案:
方案一:使用extglob扩展通配符
extglob的@()语法可以匹配括号内的任意一个模式,结合!取反就能替代重复的! -iname参数:
# 开启extglob扩展(脚本中建议加上,交互式shell如果默认没开也需要执行) shopt -s extglob # 执行删除命令 find . -type f ! -iname '@(*.mp4|*.avi|*.mkv|*.mov|*.wmv|*.mpg|*.vob|*.m4v|*.flv|*.ts|*.jpg|*.jpeg|*.png)' -delete # 可选:关闭extglob,避免影响后续命令 shopt -u extglob
方案二:使用find的正则匹配(跨shell通用)
如果不想依赖shell的extglob扩展,可以用find自带的-iregex选项(忽略大小写的正则匹配),语法更通用:
find . -type f ! -iregex '.*\.\(mp4\|avi\|mkv\|mov\|wmv\|mpg\|vob\|m4v\|flv\|ts\|jpg\|jpeg\|png\)$' -delete
进阶优化:维护后缀列表
如果需要频繁修改媒体后缀,可以把后缀存成变量,提升可维护性:
MEDIA_SUFFIXES="mp4|avi|mkv|mov|wmv|mpg|vob|m4v|flv|ts|jpg|jpeg|png" find . -type f ! -iregex ".*\.\($MEDIA_SUFFIXES\)$" -delete
注意事项
- 测试阶段建议去掉
-delete,换成-print或-ls,确认匹配的文件是需要删除的再执行删除操作 - 如果是在脚本中使用extglob,要确保脚本用bash执行(开头加
#!/bin/bash),因为sh不支持extglob
内容的提问来源于stack exchange,提问作者Martin Julien
相关产品推荐
相关产品推荐

