使用 ZSH 查找搜索项的父项

使用 ZSH 查找搜索项的父项

我的子目录有多个 .git 存储库。为了找到它们,我正在使用:

$ echo **/.git        
demo-component-a/.git demo-component-b/.git

现在我实际上需要父目录。demo-component-a& demo-component-b.

我发现这个巧妙的功能可以找到路径的父路径:

$ var=/home/blueray/Documents/antora/demo-component-b
$ echo $var:h
/home/blueray/Documents/antora

现在我正在尝试将这两者结合起来。

我已经尝试过以下方法:

$ echo $(echo **/.git):h 
demo-component-a/.git demo-component-b/.git:h

这不是我想要的。这里可以做什么?

答案1

**/.git(:h)

h 历史修改器从每个路径名中删除文件名部分。要对通配符扩展的结果使用历史修饰符,请将其放入全局限定符: 在末尾的括号中,带有前导:表示它是历史修饰符。

要仅查找目录(排除 git 链接的工作树),请使用(/:h)glob 限定符。

正如您所发现的,该:h历史修改器也可以应用于参数扩展(例如csh该功能的来源)。在 中zsh,您还可以将其应用于$IFS命令替换分割所产生的每个单词,方法如下:

print -rC1 -- ${$(echo **/.git):h}

但由于其他原因,上述内容可能是错误的(例如使用echo、在 SPC+TAB+NL+NULL 上分割文件路径)。相当于**/*.git(:h),则宁愿是:

print -rC1 -- ${(0)"$(print -rNC1 -- **/*.git)"}

相关内容