两者之间的逻辑区别是什么
ll -d !(.*@(ry|rc))
ll -d !(.*{ry,rc})
?
在我的主目录中使用它们,第二个匹配.bash_history
和.xinputrc
,而第一个则不匹配。
笔记:
$ shopt extglob
extglob on
答案1
ll -d -- !(.*{ry,rc})
结合了通配符和大括号扩展。首先将其扩展为:
ll -d -- !(.*ry) !(.*rc)
这些球体单独扩张。第一个匹配.inputrc
(bash -O extglob
但不是在ksh
该语法的来源中,也不是zsh
在ksh
模拟中,因为这些是隐藏文件,并且没有明确请求点文件)。
您可以在这些 glob 与任何文件都不匹配的目录中验证这一点(在这种情况下,glob 保持不变,bash
这是您可以解决的另一个错误功能shopt -s failglob
),例如在您没有读取权限的目录中:
$ chmod a-r .
$ bash -O extglob -c 'echo ll -d -- !(.*{ry,rc})'
ll -d -- !(.*ry) !(.*rc)
而在
ll -d -- !(.*@(ry|rc))
那是一团。
在这里,您还可以执行以下操作:
ll -d -- !(.*r[cy])
或者:
ll -d -- !(.*rc|.*ry)
请注意,该扩展中bash
还包含.
和。..
如果您想排除它们(我确信您会这样做)但仍然包含隐藏文件,您需要:
shopt -s dotglob
ll -d -- !([.]*@(rc|ry))
或者您可以明确排除它们:
ll -d -- !(.*@(rc|ry)|.|..)
在 中zsh -o extendedglob
,我会这样做:
ll -d -- ^.*(rc|ry)(D)
( 仅针对该 glob(D)
激活)。dotglob