我不确定我是否正确使用了 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 */**(/)
递归列出所有目录。