2015-04-20 81 views
0

我已經在多個目錄中,所有對文件名以下設置了許多文件:出口的文件名臨時文件慶典

prob123456_01 

我想刪除尾隨「_01」關每個文件名和將它們導出到臨時文件。我究竟如何刪除尾部「_01」以及導出?我對腳本相當陌生,所以任何幫助將不勝感激!

+2

你是什麼意思將它們導出到臨時文件_?你的意思是每個文件名都應該打印到文件中?你能否更清楚地瞭解每個文件名所遵循的模式? –

+0

你想如何表示臨時文件中的文件名?請注意,UNIX上的文件名可以包含文字換行符,因此試圖通過在文件名之間添加換行符來分隔文件名流,攻擊者可以控制這些名稱來濫用文件名。 –

回答

0

如果我理解正確,您需要一個沒有尾隨_01的文件名列表。下面要這麼做:

find . -type f -name '*_01' | sed 's/_01$//' > tmp.lst 

find . -type f -name '*_01'會在當前目錄下的所有文件,其後代的目錄,對於在_01結尾的名稱的文件。

|是所謂的管道,將左手調用的結果交給右手調用。

sed 's/_01$//'從每個文件名的末尾刪除_01

> tmp.lst結果寫入文件tmp.lst

這些是bash和喜歡的工作都非常基本的部分,所以它可能是一個好主意,看看一個或兩個教程,並與那些熟悉和其他幾個人;)

+0

謝謝!我一直在努力去熟悉自己,但我變得很難過。另外,我會怎樣修改find​​語句來查找任何具有「_」的文件,最後是任何兩個整數? (不只是01) – Will

+1

@你可以改變模式爲''* _ [0-9] [0-9]'' –

2

正如您所標記,我會假設你可以使用globstar

shopt -s globstar # enable globstar 
for f in **_[0-9][0-9]; do echo "${f%_*}"; done > tmp 

隨着globstar已啓用,模式**_[0-9][0-9]與當前目錄和任何子目錄中以_結尾的任何文件(後跟任意2位數字)匹配。 ${f%_*}使用bash的內置字符串操作功能刪除文件名的結尾。

更好

然而,當Charles Duffy建議(感謝),你可以使用一個數組,而不是一個循環:

files=(**_[0-9][0-9]); printf '%s\n' "${files[@]%_*}" 

該數組作爲填充之前匹配相同模式的文件名。 ${files[@]%_*}從數組的每個元素中刪除最後一部分,並將它們全部作爲參數傳遞給printf,後者在單獨的行上打印每個結果。

這兩種方法中的任何一種都可能比使用find更快,因爲一切都在shell中完成,而不執行任何單獨的進程。

此前我曾建議使用**_{00..99}這種模式,雖然由於幾個原因,這並不理想。它效率較低,因爲它擴大到**_00,**_01,**_02,..., **_99。此外,除非啓用另一個選項nullglob,否則這100個不匹配的模式中的任何一個都將被直接包含在輸出中。

無論您使用的是[0-9]還是[[:digit:]],但後者的優點是它匹配所有定義爲數字的字符,這取決於您的語言環境,可能會有所不同。如果這不是問題,我會和前者一起去。