【问题标题】:zsh glob qualifiers in middle of path路径中间的 zsh glob 限定符
【发布时间】:2014-11-24 10:35:57
【问题描述】:

假设我有以下目录结构:

$ 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

标签: zsh


【解决方案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)

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

【讨论】:

    【解决方案2】:

    documentation 建议只能在模式末尾使用 glob 限定符:

    用于文件名生成的模式可能以括号括起来的限定符列表结尾。限定符指定将在参数列表中插入与给定模式匹配的文件名。

    虽然不如 glob 方便,但您尝试实现的目标可以通过 find 完成:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2020-09-17
      • 1970-01-01
      相关资源
      最近更新 更多