ZSH glob 限定符在路径中间

  • 本文关键字:路径 中间 glob 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(...)/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 

最新更新