不少時候在使用Linux的shell時,咱們都須要對文件名或目錄名進行處理,一般的操做是由路徑中提取出文件名,從路徑中提取出目錄名,提取文件後綴名等等。例如,從路徑/dir1/dir2/file.txt中提取也文件名file.txt,提取出目錄/dir1/dir2,提取出文件後綴txt等。
shell
下面介紹兩種經常使用的方法來進行相關的操做。
ide
1、使用${}spa
一、${var##*/}
該命令的做用是去掉變量var從左邊算起的最後一個'/'字符及其左邊的內容,返回從左邊算起的最後一個'/'(不含該字符)的右邊的內容。使用例子及結果以下:
設計
從運行結果能夠看到,使用該命令,能夠提取出咱們須要的文件名file.txt。指針
若使用時在shell程序文件中,可使用變量來保存這個結果,再加以利用,如file=${var##*/}
ip
二、${var##*.}
該命令的做用是去掉變量var從左邊算起的最後一個'.'字符及其左邊的內容,返回從左邊算起的最後一個'.'(不含該字符)的右邊的內容。使用例子及結果以下:
it
從運行結果能夠看到,使用該命令,能夠提取出咱們須要的文件後綴。
class
若是文件的後綴不只有一個,例如,file.tar.gz,命令${var##*.}僅能提取最後一個後綴,而我想提取tar.gz時該怎麼辦?那麼就要用下面所說的${var#*.}命令了。變量
三、${var#*.}
該命令的做用是去掉變量var從左邊算起的第一個'.'字符及其左邊的內容,返回從左邊算起第一個'.'(不含該字符)的右邊部分的內容。使用例子及結果以下:
從運行結果能夠看到,使用該命令,能夠提取出文件的多個後綴。
四、${var%/*}
該命令的使用是去掉變量var從右邊算起的第一個'/'字符及其右邊的內容,返回從右邊算起的第一個'/'(不含該字符)的左邊的內容。使用例子及結果以下:
從運行的結果能夠看到,使用該命令,能夠提取出咱們須要的文件所在的目錄
五、${var%%.*}
該命令的使用是去掉變量var從右邊算起的最後一個'.'字符及其右邊的內容,返回從右邊算起的最後一個'.'(不含該字符)的左邊的內容。使用例子及結果以下:
當咱們須要創建一個與文件名相同名字(沒有後綴)的目錄與對應的文件相對應時,就可使用該命令來進行操做。例如,解壓文件的狀況就與此相似,咱們壓縮文件file.zip時,會在與file.zip同級目錄下創建一個名爲file的目錄。
六、${}總結
file
其實${}並非專門爲提取文件名或目錄名的,它的使用是變量的提取和替換等等操做,它能夠提取很是多的內容,並不必定是上面五個例子中的'/'或'.'。也就是說,上面的使用方法只是它使用的一個特例。
看到上面的這些命令,可能會讓人感到很是難以理解和記憶,其實否則,它們都是有規律的。
#:表示從左邊算起第一個
%:表示從右邊算起第一個
##:表示從左邊算起最後一個
%%:表示從右邊算起最後一個
換句話來講,#老是表示左邊算起,%老是表示右邊算起。
*:表示要刪除的內容,對於#和##的狀況,它位於指定的字符(例子中的'/'和'.')的左邊,表於刪除指定字符及其左邊的內容;對於%和%%的狀況,它位於指定的字符(例子中的'/'和'.')的右邊,表示刪除指定字符及其右邊的內容。這裏的'*'的位置不能互換,即不能把*號放在#或##的右邊,反之亦然。
例如:${var%%x*}表示找出從右邊算起最後一個字符x,並刪除字符x及其右邊的字符。
看到這裏,就能夠知道,其實該命令的用途很是普遍,上面只是指針文件名和目錄名的命名特性來進行提取的一些特例而已。
2、basename和dirname
${}並非專門爲提取文件名和目錄名設計的命令,那麼basename和dirname命令就是專門爲作這一件事而已準備的了。
一、basename
該命令的做用是從路徑中提取出文件名,使用方法爲basename NAME [SUFFIX]。
1)從路徑中提出出文件名(帶後綴),例子以下:
2)從上面命令的用法中能夠看到,後綴(SUFFIX)是一個可選項。因此,若只想提取出文件名file,而不帶有後綴,還能夠在變量的後面加上後綴名,例子以下:
二、dirname該命令的做用是從路徑中提取出目錄名,使用方法爲 dirname NAME使用例子以下:這樣就提取出了file.txt文件所在的目錄。注:該命令不只能提取出普通文件所的目錄,它能提取出任何文件所在的目錄,例如目錄所在的目錄,以下:它提取出了目錄dir2所在的目錄dir1.