如何删除当前目录中与给定模式不匹配的某些文件?

使用rm *.sh删除以.sh结尾的文件很容易理解。 但是,我如何删除当前目录中的所有文件,不以.jar结尾rm * -except *.jar

尝试这个:

 find . -mindepth 1 -maxdepth 1 ! -name '*.jar' | sort 

如果你真的想删除其输出中的所有文件,那么就这样做

 find . -mindepth 1 -maxdepth 1 ! -name '*.jar' -delete 

你可以阅读find(1)手册页来获得更多关于这个功能强大的工具的信息。

编辑:

由于-delete标志只能在GNU find> 4.2.3中找到(正如SiegeX指出的那样),下面是一些替代方法,它们也确保我们不试图删除目录:

 find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -print0 | xargs -0 -r rm -f 

-r xargs标志是一个GNU扩展,因此它稍微更加便携(它可以在* BSD上运行),但不是那么干净:

 find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -print0 | xargs -0 rm -f 

作为最后 – 但最便携的 – 度假村:

 find . -mindepth 1 -maxdepth 1 ! -type d ! -name '*.jar' -exec rm '{}' ';' 

这对每个文件分别调用rm都是不利的,这使得它显着变慢。

 echo $(ls | grep -v '.jar$') rm $(ls | grep -v '.jar$') 

你可以通过启用扩展的glob extglob选项,然后把你的模式放在!()来做到这一点:

 shopt -s extglob; rm !(*.jar) 

请注意, extglob也给你以下内容:

  • ?() – 匹配零或一个模式
  • *() – 匹配零个或多个模式
  • @() – 完全匹配其中的一种模式
  • !() – 匹配除了模式以外的任何内容