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

さて、これら2つを組み合わせようとしています。

私は以下を試しました:

$ 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}

ただし、上記は他の理由で間違っている可能性があります(例:を使用するか、echoSPC + TAB + NL + NULLからファイルパスを分割するなど)。と同じ**/*.git(:h)場合は次のようになります。

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

関連情報