私のサブディレクトリに複数の.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}
ただし、上記は他の理由で間違っている可能性があります(例:を使用するか、echo
SPC + TAB + NL + NULLからファイルパスを分割するなど)。と同じ**/*.git(:h)
場合は次のようになります。
print -rC1 -- ${(0)"$(print -rNC1 -- **/*.git)"}