如何在不替换&&为&的前提下,解决无指定外文件时后续命令不执行问题
搞定这个问题很简单!
你遇到的坑其实是&&的执行规则在搞鬼:它要求前一条命令必须完全成功(退出码为0),才会接着跑后面的do something2。而当目录里没有非jpg文件时,你的删除命令会返回非零退出码(因为rm找不到要删的东西,会报错),直接把后续命令给卡停了。不用换成&的话,给你三个实用方案:
方案1:给rm加个-f参数(最省心)
把删除命令改成这样:
rm -f !(*.jpg)
-f是"强制删除"的意思,它会让rm忽略"文件不存在"的错误——不管有没有非jpg文件,这条命令都会返回退出码0,&&后面的命令自然就能正常执行了。
小提醒:如果你的shell是bash,得确保开启了
extglob扩展(默认一般是开的,要是没开先跑shopt -s extglob),!(*.jpg)这种排除式通配符才能生效。
方案2:换用find命令(更稳妥)
find命令天生友好:哪怕没找到匹配的文件,它也会返回退出码0,完美适配&&的要求。命令如下:
find . -maxdepth 1 -type f ! -name "*.jpg" -delete
拆解一下参数:
-maxdepth 1:只处理当前目录,不递归子目录(要是想删子目录里的就去掉这个)-type f:只删文件,不碰目录(避免误删文件夹)! -name "*.jpg":排除所有后缀为jpg的文件-delete:直接删除找到的目标文件
要是需要区分大小写(比如要排除.JPG .Jpg这类),把-name换成-iname就行:
find . -maxdepth 1 -type f ! -iname "*.jpg" -delete
方案3:先检查再删除(最严谨)
先判断目录里有没有非jpg文件,有就删,没有就跳过,这样不管哪种情况,这个判断块的退出码都是0,不会影响后续命令:
if compgen -G "!(*.jpg)" > /dev/null; then rm !(*.jpg); fi
compgen -G会帮你匹配符合模式的文件,只要有匹配项,就执行rm;没有的话直接跳过,全程不会返回错误码。
这三个方案都不用动你的&&,挑个顺手的用就行~
内容的提问来源于stack exchange,提问作者john c. j.
相关产品推荐
相关产品推荐

