題 獲取文件的父目錄


我想得到一個文件的父目錄的名稱。

示例:我有 path=/a/b/c/d/file,我只想要 d 並不是 /a/b/c/d (我得到的 dirname $path)作為輸出。

有沒有復雜的方法來做到這一點?


18
2018-01-20 06:02


起源




答案:


聽起來你想要基名  名字:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d

20
2018-01-20 07:11



為什麼我收到。而不是debian上的父目錄? - Amir
@Amir:您是以完整路徑開始,還是只是文件名?如果它只是一個文件名,那麼 dirname 命令將假定它在當前目錄(又名“。”)中。 - Gordon Davisson
好吧,我使用這個: parentname="$(basename "$(dirname "$pwd")")" - Amir
@Amir:Shell變量區分大小寫,並且 PWD 必須資本化。嘗試 parentname="$(basename "$(dirname "$PWD")")"。 - Gordon Davisson


您可以使用pwd獲取當前工作目錄,並使用 參數擴展 避免將它分成另一個(子)shell。

echo ${PWD##*/}

編輯: 證明來源


4
2018-01-20 09:06



該問題與當前目錄無關。你可以用 ${path##*/} - Matteo


我認為這是一種資源較少的解決方案:

 $ filepath=/a/b/c/d/file
 $ echo ${${filepath%/*}##*/}
 d

編輯: 抱歉,在bash中無法進行嵌套擴展,但它在zsh中有效。 Bash的版本:

 $ filepath=/a/b/c/d/file
 $ path=${filepath%/*}
 $ echo ${path##*/}
 d

1
2018-01-20 10:05



有些邊緣情況不能很好地處理,主要是在沒有完整的多級路徑時。例如,嘗試一下 filepath=file 或filepath = / file`。 - Gordon Davisson
確實。但是什麼是父目錄 foofile?如果它不是完整路徑不能知道(也許如果 foofile 現有文件不僅是“字符串”)。 - uzsolt


在bash中,在一行中:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

1
2018-04-28 17:34



你能詳細說明所涉及的程序嗎?它可以對未來的讀者有所幫助。另外,請盡量不寫1/2行答案。 - Lorenzo Von Matterhorn


我最喜歡Julian67的答案,但這裡有一個擴展版本:

file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;')  # cut away "/a/b/c/"
echo $parent # --> you get "d"

0
2017-10-29 13:31