Bash For循环排除特定后缀文件:为何我的命令无法生效?
问题分析与解决方法
你的错误在于用了不符合Bash规则的通配符写法,*![.en].mp4里的!和[.en]会被当成普通字符处理,根本起不到排除*.en.mp4文件的作用,所以命令无法正常工作。
下面给你两种可行的解决方式:
方法一:使用Bash扩展通配符(extglob)
Bash的扩展通配符支持排除类匹配,不过需要先确认功能是否开启:
- 检查状态:运行
shopt extglob,如果输出extglob off,就执行shopt -s extglob开启它。 - 修正后的循环命令:
for file in /home/ubuntu/discovery/download/!(*.en).mp4; do # 在这里添加你要执行的操作,比如打印文件名 echo "$file" done
!(*.en).mp4的逻辑是:匹配所有以.mp4结尾,但文件名末尾部分不是.en的文件,刚好能排除掉*.en.mp4格式的目标文件。
方法二:普通循环加条件判断
如果不想启用扩展通配符,可以先遍历所有.mp4文件,再通过条件过滤掉不需要的文件:
for file in /home/ubuntu/discovery/download/*.mp4; do if [[ "$file" != *.en.mp4 ]]; then # 执行你的操作 echo "$file" fi done
这个逻辑很直观:先获取所有.mp4文件,再跳过那些以.en.mp4结尾的文件。
内容的提问来源于stack exchange,提问作者khofm
相关产品推荐
相关产品推荐

