我的子目录有多个 .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)"}