与えられた名前の祖先ディレクトリを見つける方法は?

与えられた名前の祖先ディレクトリを見つける方法は?

特定の名前を持つ親ディレクトリのパスを見つけるには?たとえば、ディレクトリがあり、返す名前の/a/b/c/d/e/f/g親ディレクトリを探したいとします。c/a/b/c

ユースケースは、かなり入れ子になったディレクトリ構造にあり、読みにくい文字列を持ちたくないので、ディレクトリの入れ子の../../..レベルを更新するときに次のことも確認する必要があります。将来のディレクトリ構造で対応する文字列を変更します。

破壊的ではありませんが、特定の名前を持つ2つの親ディレクトリがある場合は、理想的にはパスが最も長いディレクトリが必要です。つまり、理想的には代わりに/a/b/c/d/e/c/f/g返さなければなりません。/a/b/c/d/e/c/a/b/c

答え1

解決策は、パラメータ置換を2回使用することです。

まず、ディレクトリのパス名を変数に保存します(現在の作業ディレクトリを処理している場合は、この手順をスキップして後でPWD使用できますp)。

$ p=/a/b/c/d/e/c/f/g

*/c/その後、一致する最も長いプレフィックス文字列を削除できます。

$ echo "${p##*/c/}"
f/g

それから私たちはこの結果を終わり$p、我々は我々が望む結果を得るでしょう:

$ echo "${p%${p##*/c/}}"
/a/b/c/d/e/c/

/または、最後のエントリも削除します。

$ echo "${p%/${p##*/c/}}"
/a/b/c/d/e/c

これ標準パラメータの置換 ${variable##pattern}${variable%pattern}最長一致プレフィックス文字列と最短一致サフィックス文字列をそれぞれ削除します。

/a/b/c(不要なものを取得するには、「内部」置換にofを使用できます###

関連情報