1
我有很長的文件路徑,像獲取父目錄名稱和文件名,但沒有擴展名從完整的文件路徑在bash中?
/path/to/file/dir1/dir2/file.txt.gz
我感興趣的是得到的文件名沒有最後延伸(即file.txt
)和父目錄(dir2
的名字,我不想父目錄的完整路徑,只是它的名字)。
如何在bash中做到這一點?
我有很長的文件路徑,像獲取父目錄名稱和文件名,但沒有擴展名從完整的文件路徑在bash中?
/path/to/file/dir1/dir2/file.txt.gz
我感興趣的是得到的文件名沒有最後延伸(即file.txt
)和父目錄(dir2
的名字,我不想父目錄的完整路徑,只是它的名字)。
如何在bash中做到這一點?
使用bash:
s='/path/to/file/dir1/dir2/file.txt.gz'
file="${s##*/}"
file="${file%.*}"
echo "$file"
file.txt
filder="${s%/*}"
folder="${folder##*/}"
echo "$folder"
dir2
使用awk
:
awk -F '/' '{sub(/\.[^.]+$/, "", $NF); print $(NF-1), $NF}' <<< "$s"
dir2 file.txt
讀取它們到殼變量:
read folder file < <(awk -F '/' '{sub(/\.[^.]+$/, "", $NF);print $(NF-1), $NF}'<<<"$s")
第一部分可以通過基名來解決(1):
$ basename /path/to/file/dir1/dir2/file.txt.gz
file.txt.gz
$
目錄名(1)則正好相反,這是不太你想要什麼,但也許你可以使用它作爲起點:
$ dirname /path/to/file/dir1/dir2/file.txt.gz
/path/to/file/dir1/dir2
$
當然,你可以隨時使用Perl:
$ perl -E 'do { @p=split m|/|; say $p[-2] } for @ARGV' /path/to/file/dir1/dir2/file.txt.gz
dir2
$
我不知道這意味着什麼。你能將結果(dirname和文件名沒有最後的擴展名)存儲到兩個變量中:'file'和'folder'嗎?這樣我可以做一些有用的事情。謝謝。 – becko 2015-02-09 19:50:37
我也用BASHism更新了答案。您可以使用:'file =「$ {p%。*}」''和'folder =「$ {d ## * /}」'而不是上面的'echo'語句。 – anubhava 2015-02-09 19:53:08