zsh在路径中间使用通配符限定符

6
假设我有以下目录结构:
$ mkdir -p a/1
$ ln -s a b

搜索目录时,我也可以获取符号链接中的目录:
$ print -l */*(/)
a/1
b/1

如何将对第一个目录级别的globbing限制为只包括目录,而不包括符号链接?常规方法无效:

$ print -l *(/)/*(/)
zsh: bad pattern: *(/)/*(/)

更加普遍地说,我如何为中间路径组件指定glob限定符?大致如下:
$ print -l a(...)/b(...)/c(...)/d(...)/e(...)/f(...)

“(...)”表示对应路径组件的全局限定符。


可能是您所询问的特殊情况,但 ** 不会遵循符号链接。在您的示例中,print -l **/1 只会匹配 a/1,而不是 b/1 - chepner
2个回答

1

如果您不介意在列表中出现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)

这样,您还可以为路径中的每个部分设置不同的全局限定符,但您需要为每个部分创建单独的参数。


0

文档建议仅在模式的末尾使用glob限定符:

用于文件名生成的模式可以以括号括起来的限定符列表结尾。这些限定符指定哪些文件名将被插入到参数列表中,否则它们会与给定的模式匹配。

虽然不如glob方便,但您想要实现的目标可以使用find完成:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接