2010-11-23 18 views

回答

6

试试这个:

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

如果你真的想删除其输出的所有文件,那么只要做

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

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

编辑:

由于-delete标志在GNU才发现找> 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
echo $(ls | grep -v '.jar$') 

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

如果某些文件名包含空格怎么办? – 2010-11-23 23:43:42

+0

呃,这对于文件名中的空格有没有一些相当重要的问题? – thkala 2010-11-23 23:44:46

+0

@Gareth:呃......你比较快。无论如何,我只是验证了(主要是为了我的安心),如果文件名中有空白,这将不起作用。 – thkala 2010-11-23 23:46:23

1

您可以通过启用扩展水珠extglob选项,然后把你的模式里面!()像这样做:

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

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

  • ?() - 匹配零或一个模式
  • *() - 匹配零个或多个模式
  • @() - 匹配模式的
  • !()的只有一个 - 匹配任何除了图案
相关问题