我怎样才能指定排除某些文件的shell模式?

例如,我想删除除了.tar文件之外的目录中的所有文件。 我可以做这样的事情:

 find . -maxdepth 0 | grep -v '.tar$' | xargs rm -f 

但有没有办法只是使用rm和shell模式匹配 ? 如果无法使用香草sh ,可以使用bash或其他常用的shell或扩展选项指定它。

我发现一个类似的问题,关于避免目录和子目录与查找 ,而不是壳模式。

你可以用扩展的globbing来实现。

 shopt -s extglob 

然后

 rm !(file.tar) 

这至less在bash 3.2.39中起作用

我不认为你想达到什么是可能的。

你可以简化你的命令:

 find . -maxdepth 0 -not -name '*.tar' -exec rm -f {} + 

也许试试这个

 find . -maxdepth 0 \! -name '*.tar' -exec echo rm -f {} \; 

如果看起来正确,删除rm前面的回显。

是的,但有一个贝壳模式?

我不这么认为。 至less不是在我熟悉的bash版本中。 从其他的答案看来,更新的版本可能更加function。

编辑:

快速阅读问题…但在继续我的post反正… :-)如果你想删除所有的文件,但tar文件recursion与zsh:

 rm -rf **/^*.tar(.) 

非recursion:

 rm -rf ^*.tar(.) 

新的bash 4.0和zsh支持recursion通配。 要在bash中启用它:

 shopt -s globstar 

它的工作原理是:

  rm -rf **/*.tar.gz