>假设我有以下目录结构:
$ mkdir -p a/1
$ ln -s a b
通配目录,我也在符号链接中获取目录:
$ print -l */*(/)
a/1
b/1
如何将第一个目录级别的通配限制为仅目录,不包括符号链接?显而易见的不起作用:
$ print -l *(/)/*(/)
zsh: bad pattern: *(/)/*(/)
更一般地说,如何为中间路径组件指定 glob 限定符?在精神上:
$ print -l a(...)/b(...)/c(...)/d(...)/e(...)/f(...)
其中(...)
表示相应路径组件的 glob 限定符。
如果您不介意a
本身出现在您的列表中,那么这应该可以解决问题:
# ** doesn't follow symlinks.
print -l **/*(/)
如果您只需要子目录,则需要使用两种模式,而不是一种模式:
# Make an array with all dirs that are in the pwd.
tmp=( *(/) )
# $^tmp applies brace expansion on the array.
# (N) ignores 'file not found' errors, in case tmp contains dirs w/out children.
print -l $^tmp/*(/N)
这样,您还可以为路径中的每个部分设置不同的 glob 限定符,但您必须为每个部分创建一个单独的参数。
文档建议 glob 限定符只能在模式的末尾使用:
用于文件名生成的模式可能以括在括号中的限定符列表结尾。限定符指定哪些与给定模式匹配的文件名将插入到参数列表中。
虽然不如 glob 方便,但您要实现的目标可以通过find
来完成:
find -H . ! -path . -type d -links 2 | xargs
./a/1