Bash Bug?Can';不要使用否定extglob!(*/)以筛选出目录?

Bash Bug?Can';不要使用否定extglob!(*/)以筛选出目录?,bash,shell,Bash,Shell,如果glob*/仅与目录匹配,则逻辑上extglob!(*/)应匹配非目录;但这不起作用。这是一个错误还是我遗漏了什么?这对任何外壳都有效吗 测试1证明*/有效 测试2用显示潜在的bug!(*/) 在Bash中,!()(如*、?、*()和@())仅适用于一个路径组件。因此,!(任何包含/斜杠的内容)都不起作用 如果切换到,可以使用*(^/)匹配所有非目录,或使用*(.)匹配所有普通文件。已给出特定问题的答案;我不确定您是否真的想要另一个解决方案,或者您是否只是想分析行为,但列出当前文件夹中所有非

如果glob
*/
仅与目录匹配,则逻辑上extglob
!(*/)
应匹配非目录;但这不起作用。这是一个错误还是我遗漏了什么?这对任何外壳都有效吗

测试1证明
*/
有效 测试2用
显示潜在的bug!(*/)
在Bash中,
!()
(如
*
*()
@()
)仅适用于一个路径组件。因此,
!(任何包含/斜杠的内容)
都不起作用


如果切换到,可以使用
*(^/)
匹配所有非目录,或使用
*(.)
匹配所有普通文件。

已给出特定问题的答案;我不确定您是否真的想要另一个解决方案,或者您是否只是想分析行为,但列出当前文件夹中所有非目录的一种方法是使用“查找”:

find . ! -type d -maxdepth 1

+1.有趣的观察。我刚刚验证了你的观察结果,结果证明你是对的。很高兴知道正确答案。:-)我相信glob在文件名上工作,
*/
匹配目录的事实是因为模式形成了一个有效的路径,但glob仍然仅适用于文件名。您能否进一步详细说明仅使用一个路径组件的含义感谢您解释我为什么无法使用
?(/boot/vmlinuz*)
工作!只有
/boot/?(vmlinuz*)
能够正常工作。
$ cd /tmp; shopt -s extglob; ls -ld !(*/)
/bin/ls: cannot access !(*/): No such file or directory
find . ! -type d -maxdepth 1