2013-12-18 36 views
3

這個問題可能已經被問到,但我不知道如何把它寫好。我是新來的bash腳本...如何在Bash中獲得文件名的通配符部分

假設我有一個目錄一堆文件具有類似名稱:

file1_pre.ext 
file2_pre.ext 
file3_pre.ext 
different_tmp.ext 

我可以使用使用通配符來篩選感興趣的文件:

for f in *_pre.ext 
do 
    echo $f 
done 

但我怎麼解析/提取前綴,這樣我可以得到弦file1file2等作爲文件名別的東西來使用?

回答

3

${f%_pre.ext}將展開爲f的值,最後的_pre.ext被刪除。

有幾種字符串操作可以在${varname<SomeOperator>args}的參數擴展中完成。 %運算符刪除尾隨字符串。它需要一個通配符參數,因此您可以使用${f%_*}之類的操作來刪除下劃線後的所有內容。如果您將%加倍,如${f%%_*},則會刪除最長匹配,因此您會在第一個下劃線後殺死所有東西。單個的%確實是最短的匹配,所以它將刪除最後一個下劃線後的所有內容。由於我們正在尋找完全匹配,因此使用%_pre.ext並沒有什麼不同。

###運營商類似於%%%但工作在字符串的開始而不是結束。

另一個常用的示例是:-運算符,如果該變量爲空,則該運算符將替換默認值。

此外,${foo}沒有運營商的寫作$foo的另一種方法,但可以幫助你,有時,當你想立即把一些文字變量的值之後:

echo $foobar # oops, looks for variable called "foobar" 
echo ${foo}bar # the value of variable "foo" then literal "bar" 

有關完整列表,請參閱任何shell手冊頁的「參數擴展」部分。

+1

@mrKelley請參閱http://tldp.org/LDP/abs/html/abs-guide.html#AEN22568。缺點是:要對一個變量值執行操作(或者通常,爲了使變量引用在視覺上更加獨特),將其名稱放在'{}'中;在這種情況下,應用'%'等操作,在這種情況下,它會從變量值的* back *中去掉'_pre.ext'。 – mklement0

+0

感謝您的解釋!這正是我所需要的。 – mrKelley

+0

添加了一些一般背景信息... –

相關問題