如何在Bash中使用通配符删除文件并排除指定文件?
解决删除所有.BAR文件但保留FOO.BAR的问题
原命令出错原因
你执行的rm *.BAR !(FOO.BAR)会同时匹配两类文件:
- 所有后缀为
.BAR的文件(包含FOO.BAR本身) - 所有不是FOO.BAR的文件(包含所有
.BAZ文件)
两者结合后,shell会把当前目录下的所有文件都传给rm,最终导致全部文件被删除。
正确解决方案
方法1:使用bash扩展通配符(extglob)精准匹配
先开启extglob(未开启时执行),再匹配所有非FOO开头的.BAR文件:
shopt -s extglob rm !(FOO).BAR
这个模式!(FOO).BAR只会匹配文件名不以FOO开头且后缀为.BAR的文件,不会触碰.BAZ文件,同时完美保留FOO.BAR。
方法2:用GNU rm的--exclude选项(更直观)
如果你的rm是GNU版本(大部分Linux系统默认是),可以直接用排除选项:
rm --exclude=FOO.BAR *.BAR
这个命令明确指定:删除所有.BAR文件,但排除FOO.BAR。
方法3:用find命令(跨shell兼容)
如果需要在非bash环境(如sh)执行,或者需要更严谨的文件匹配逻辑,使用find:
find . -maxdepth 1 -type f -name "*.BAR" ! -name "FOO.BAR" -delete
-maxdepth 1:仅在当前目录查找,不递归子目录-type f:只操作普通文件(排除目录等非文件类型)-name "*.BAR":匹配所有.BAR后缀的文件! -name "FOO.BAR":排除FOO.BAR-delete:直接删除匹配到的目标文件
内容的提问来源于stack exchange,提问作者user21630036
相关产品推荐
相关产品推荐

