例如,我想删除目录中除其.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