2013-05-31 49 views
7

鑑於這樣的路徑測試/ 90_2a5/Windows的通過管道目錄名的成績獲得父母的目錄名稱在bash腳本來BASENAME

我試圖使用這些命令dirname來得到結果90_2a5得到路徑後basename得到名稱。

當我嘗試在單行中嘗試將結果從dirname傳遞到basename時,會出現問題。

我已經試過這個,但似乎我用它錯了。

path="test/90_2a5/Windows" 
finalName= basename var | dirname $path 
echo "$finalName" 

的問題是finalName是一個空字符串,這意味着從dirname結果不重定向。

回答

16

你不用管他們,而是他們作爲參數傳遞:

finalName=$(basename -- "$(dirname -- "$path")") 

一些命令很簡單,不接受輸入流,但只有參數:

$ echo foo/bar | basename 
basename: missing operand 
Try `basename --help' for more information. 
$ basename foo/bar 
bar 
+0

很好的答案!非常感謝! – stratis

+3

你也可以這樣做'echo foo/bar | xargs basename'。使用'xargs'使基本名稱接受流。 – jeffreyveon

+0

@jeffreyveon不,'xargs'將'basename'的標準輸入轉換爲*參數列表*。 – l0b0

0

使用$ {path#* /}去除字符直到第一個'/'。然後使用dirname刪除「/ Windows」。

finalName=$(dirname ${path#*/}) 
+0

-1這相當於'目錄名稱$ path' – l0b0

+0

@ I0b0感謝指出了這一點。 – suspectus

+0

這仍然沒有檢索目錄的基本名稱。嘗試例如'path =/test/90_2a5/Windows' – l0b0

1

其實,您也可以在不使用任何外部程序(如dirnamebasename)的情況下執行此操作,只需使用bash字符串操作操作:

path="test/90_2a5/Windows" 
# delete from last/to end 
dir=${path%/*} 
# delete from beginning to last/
finalName=${dir##*/} 
echo "$finalName" 
6
$ echo 'test/90_2a5/Windows' | xargs dirname | xargs basename 
90_2a5