我如何指定排除某些文件的 shell 模式?

我如何指定排除某些文件的 shell 模式?

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

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

但有没有办法只使用 rm 和shell 模式匹配bash如果无法使用 vanilla 来完成,请随意使用或其他常用的 shell 或扩展选项来指定它sh

我发现了类似的问题使用 find 避免目录和子目录,但没有贝壳图案。

答案1

您可以使用扩展的通配符来实现这一点。

shopt -s extglob

然后

rm !(file.tar)

这至少在 bash 3.2.39 中有效

答案2

我认为你想要实现的目标是不可能的。

不过,您可以简化现有的命令:

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

答案3

也许可以尝试一下

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

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

是的,但是有贝壳图案吗?

我不这么认为。至少在我熟悉的 bash 版本中不是这样。从其他答案来看,新版本可能功能更强大。

答案4

编辑:

阅读问题太快了...但无论如何都要继续阅读我的帖子... :-) 如果你想删除所有内容文件但是使用 zsh 递归地 tar 文件:

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

非递归:

rm -rf ^*.tar(.)

新的 bash 4.0 和 zsh 支持递归通配符。要在 bash 中启用它,请使用:

shopt -s globstar

它的工作原理如下:

 rm -rf **/*.tar.gz

相关内容