如何使用 ZSH 从命令中排除文件?

如何使用 ZSH 从命令中排除文件?

鉴于此目录内容:

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
    

相关内容