我正在尝试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
,并且两者可能不是同一复合命令或函数的一部分。