ZSH: `ls *(.)` 仅列出常规文件,但 `ls *(/)` 不仅列出目录

ZSH: `ls *(.)` 仅列出常规文件,但 `ls *(/)` 不仅列出目录

我不确定我是否正确使用了 ZSH 的通配符,但我认为ls *(/)只会列出 下的目录pwd,但事实并非如此,它递归地列出 下每个目录下的所有文件pwd(我从有用的 zsh 技巧列表)

对于专门列出当前路径下的目录,什么是正确的通配符?

答案1

我怀疑问题不是 zsh 通配,而是ls默认行为,即当给定目录参数时列出目录的内容。

我建议尝试一下

ls -d -- <your-glob-here>

测试你的 glob 的最好方法是

printf '%s\n' <glob>

或者

print -rC1 -- <glob>

答案2

实现它的另一种方法是

 print *(/)

或者

 echo *(/)

更新1

一点点更多的正确的版本(如@Stéphane Chazelas 指出)是

print -rl -- *(/) 

或者

echo -E - *(/)

注意文件名中的空格 (-l)、转义序列 (-r/-E) 和前导连字符 (-/-)。

更新2

然而正确的版本是print -rN通过用空值分隔结果来额外处理文件名内的换行符(Linux允许,Windows不允许),例如:

print -rN -- **/*(/) |xargs -0 -n10 chmod g+s

它递归地设置 setguid 位 - 选择性地寻址目录,而不是chmod -R g+s.

更新3

对于巨大的树,这仅处理文件的一部分(由于命令行长度的限制)并默默地保留其余部分。以下命令可以处理这种情况:

find . -type d -print0 |xargs -0 -n10 chmod g+s

答案3

列出当前目录中的所有目录类型

ls -d -- *(/)
ls -d *(/)

否则使用

ls -d */**(/)

递归列出所有目录。

相关内容