ZSH 中的否定通配符

ZSH 中的否定通配符

我正在尝试ls **/*!(test).rb扩展到所有不以“test”结尾的 ruby​​ 文件。然而,到目前为止我所尝试的一切都没有帮助。我尝试打开 ZSH 的扩展通配选项,但没有成功。

我知道可以做类似的事情ls -l **/*.rb | grep -v test,但我真的很想只用通配符来做到这一点

答案1

setopt extended_glob; ls -d -- **/(^*test).rb

或者

setopt ksh_glob; ls -d -- **/!(*test).rb

与您的版本 ( ) 不同的形式*!(test).rb也将匹配foo-test.rb,因为*匹配foo-test文件名的一部分,而!(test)否定则匹配空字符串。


“ksh-glob”形式也适用于bash, shopt -s globstar extglob

#! /bin/bash
shopt -s globstar extglob
ls -d -- **/!(*test).rb

请注意,在 bash 中,在 和 扩展模式的使用之间应该有一个换行符shopt -s extglob,并且两者可能不是同一复合命令或函数的一部分。

相关内容