You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 15:40:24