2014-01-07 49 views
0

我有一個目錄中的3個文件象下面這樣:替換字符串中的Unix

file_str_23.txt 
file_jan_24.txt 
file_feb_25.txt 

在這裏我想用「_文件」替換第一個文件名「file_str」,所以最後的文件名應該是'file_23.txt'。

問題是我不知道文件名中的確切數字,所以我應該只使用'file_str'字符串。

如何做到這一點?

回答

2

要更改單個文件的名稱,使用mv

mv file_str_23.txt file_23.txt 

如果你想這樣做批量,你可以嘗試rename,它接受正則表達式:

rename 's/_.*?_/_/' file_* 

第一個參數是一個Perl正則表達式替換表達式。它的一般形式是:

s/WHAT_TO_LOOK_FOR/WHAT_TO_PUT_INSTEAD/ 

在我們的例子WHAT_TO_LOOK_FOR是_.*?_和WHAT_TO_PUT_INSTEAD是_

現在,_.*?_表示:「匹配下劃線後跟任意數量的任何字符(.*?),然後是另一個下劃線」。例如,在字符串「file_str_23.txt」中它將匹配「str」。

該匹配部分的文件名將被替換爲_(我們的WHAT_TO_PUT_INSTEAD部分)。如果你正在使用bash

+0

嗯這裏的問題是我不知道文件名中的確切數字,所以我應該去與'file_s tr'字符串。 –

+0

好的,查看更新後的答案。你的原始問題沒有提到批量重命名; p – kamituel

+0

你能解釋'/_.*?_///'部分嗎? –

1

,你也可以使用這個

for F in file_*.txt ; do 
    mv ${F} file_${F#file_*_} 
done 

這是超級容易製作成一個班輪:

for F in file_*.txt ; do mv ${F} file_${F#file_*_} ; done 
1

你可以試試這個for循環應該工作沒有任何外部效用:

for f in *_*_*.txt; do 
    mv "$f" "${f/_*_/_}" 
done