Directory
如何找到具有給定名稱的祖先目錄?
如何找到具有特定名稱的父目錄的路徑?例如,假設我有目錄
/a/b/c/d/e/f/g
,我想找到帶有 name 的父目錄c
,我希望它返回/a/b/c
。案例是我在一個相當嵌套的目錄結構中,我不想有難以閱讀的字元串
../../..
,當我更新嵌套級別時,我還需要確保更改以後的目錄結構。不是一個破壞者,但如果有兩個具有給定名稱的祖先目錄,我理想情況下想要一個路徑最長的目錄。即
/a/b/c/d/e/c/f/g
理想情況下應該返回/a/b/c/d/e/c
而不是/a/b/c
.
解決方案是使用參數替換,兩次。
我們首先將目錄的路徑名儲存在一個變數中(如果您正在處理目前工作目錄,您可以跳過它並
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
您不想要的 ,您可以#
在##
“內部”替換中使用)