Linux 切分文件名或文件擴展名

有一些腳本是根據文件名進行各類處理的。 shell所具備的一些內建功能能夠依據不一樣的狀況來切分文件名。shell

藉助%操做符能夠輕鬆的將名稱部分從"名稱.擴展名"這種格式中提取出來。能夠按照下面的方法從list.txt中提取名稱。google

# file_name="list.txt"
# name=${file_name%.*}
# echo File name is: $name
輸出結果:File name is: list

下一個是將文件名的擴展名部分提取出來,這能夠藉助#操做符實現。code

# name=${file_name#*.}
# echo Extension is: $name
輸出結果:Extension is txt

工做原理: 在第一個任務裏,爲了從"名稱.擴展名"這個格式中提取名稱,咱們使用了%操做符。字符串

${VAR%.*} 的含義以下:域名

從$VAR中刪除位於%右側的通配符(在前例中是.*)全部匹配的字符串。通配符從右向左進行匹配。io

給$VAR賦值,VAR="list.txt"。那麼,通配符從右向左就會匹配到.txt,所以,從$VAR中刪匹配的結果,就會獲得輸出list變量

%屬於非貪婪操做,它從右到左找出匹配通配符最短的結果。還有另一個操做符%%,這個操做符與%類似,可是它的行爲模式倒是貪婪的,這說明它會匹配符合條件的最長的字符。原理

好比,咱們有這樣一個文件:擴展

# VAR="hack.fun.book.txt"
# echo ${VAR%.*}
輸出結果:hack.fun.book

操做符%使用.*從右到左執行非貪婪匹配(.txt)file

使用%%操做符:

# echo ${VAR%%.*}
輸出結果:hack

操做符%%使用.*從右到左執行貪婪匹配(.fun.book.txt)

在第二個任務中,咱們用#操做符從文件名中提取擴展名。這個操做與%相似,不過求值方向是從左到右。

${VAR#*.}的含義以下:

從$VAR中刪除位於#右側的通配符(即在前例中使用的*.)所匹配的字符串。通配符從左向右進行匹配。

和%%相似,#也有一個貪婪操做符##

##從左向右進行貪婪匹配,並從指定變量中刪除匹配結果。

來看一個例子:

# VAR="hack.fun.book.txt"

使用#操做符:(非貪婪)

# echo ${VAR#*.}
輸出結果:fun.book.txt

使用##操做符:(貪婪)

# echo ${VAR##*.}
輸出結果:.txt

注意:

由於文件名中可能包含多個'.'字符,因此相較於#,##更適合從文件名中提取擴展名。##執行的是貪婪匹配,所以老是可以準確的提取出擴展名。

這裏咱們使用一個域名來作個總結:URL="www.google.com"

# echo ${URL%.*}        #移除.*所匹配的最右邊的內容
輸出:www.google

# echo ${URL%%.*}    #將從右邊開始一直匹配到最左邊的.*移除(貪婪操做符)
輸出:www

# echo ${URL#*.}        #移除*.所匹配的最左邊內容
輸出:google.com

#echo ${URL##*.}    #將從左邊開始一直匹配到最右邊的*.移除(貪婪操做符)
輸出:com
相關文章
相關標籤/搜索