![如何使用 ZSH 从命令中排除文件?](https://linux22.com/image/1413676/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20ZSH%20%E4%BB%8E%E5%91%BD%E4%BB%A4%E4%B8%AD%E6%8E%92%E9%99%A4%E6%96%87%E4%BB%B6%EF%BC%9F.png)
鉴于此目录内容:
one.file
two.file
three.file
在 bash 中,当我输入
rm *.file !(two)
仅one.file
并被three.file
删除。我如何在 ZSH 中执行此操作?
答案1
我也对答案很感兴趣,快速搜索后找到了这个关于 zsh 中的通配符的文章. 亮点:
^
用作否定。例如,ls ^two.file
将仅列出 one.file 和 three.file。- 您可以将
^
和组合起来*
。例如,ls ^two*
将列出不以“two”开头的所有内容 - 您可以使用括号来进行更复杂的匹配。例如,
ls (^two).file
将列出没有以“two”开头,并且做以“文件”结尾。
答案2
如果要使用 ksh 语法,只需在 zsh 中ls !(two).file
打开该选项:KSH_GLOB
$ setopt KSH_GLOB
$ ls -1 !(two).file
one.file
three.file
但是 zsh 提供了其他强大的通配符技术,可以通过EXTENDED_GLOB
选项激活。有关完整列表,请阅读文件名生成在 中man zshexpn
。与该问题最相关的是这些运算符:
^x
匹配除模式之外的任何内容X,所以你的情况ls -1 ^two.file
x~y
更强大,因为它可以匹配任何符合模式的内容X但不匹配是,所以ls -1 *~two.file
。特别的是,你可以使用另一个通配符模式X例如$ ls -1 *.file~two* one.file three.file
对于 运算符来说这是不可能的
^
,在这种情况下它相当于*~
:$ ls -1 *.file^two* one.file three.file two.file