路径中间的zsh全局限定符

路径中间的zsh全局限定符,zsh,Zsh,假设我有以下目录结构: $ 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(...)/

假设我有以下目录结构:

$ 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方便,但您可以通过
find

find -H . ! -path . -type d -links 2 | xargs
./a/1 

如果您不介意列表中出现
a
本身,那么这应该可以做到:

#**不遵循符号链接。
打印-l**/*(/)
如果只需要子曲面,则需要使用两种模式,而不是一种模式:

#使用pwd中的所有dir创建一个数组。
tmp=(*(/))
#${^tmp}在数组上应用大括号扩展。
#(N)忽略“未找到文件”错误,以防tmp包含带/不带子项的目录。
打印-l${^tmp}/*(/N)

这样,您也可以为路径中的每个部分使用不同的glob限定符,但您必须为每个部分创建一个单独的参数。

可能是您所要求的特殊情况,但
**
不遵循符号链接<在您的示例中,code>print-l**/1只匹配
a/1
,而不匹配
b/1