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

时间:2010-11-23 23:29:51

标签: unix shell command-line terminal

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

这样的东西

3 个答案:

答案 0 :(得分:6)

试试这个:

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,这使得速度明显变慢。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您可以通过启用扩展的glob extglob选项然后将您的模式放在!()中来执行此操作:

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

请注意,extglob还会为您提供以下内容:

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