2012-09-26 92 views
4

我一直在使用rename命令批量重命名文件。到現在爲止,我已經有喜歡的文件:使用通配符'重命名'

2010.306.18.08.11.0000.BO.ADM..BHZ.SAC 
2010.306.18.08.11.0000.BO.AMM..BHZ.SAC 
2010.306.18.08.11.0000.BO.ASI..BHE.SAC 
2010.306.18.08.11.0000.BO.ASI..BHZ.SAC 

,並使用rename 2010.306.18.08.11.0000.BO. "" *rename .. _. *我讓他們減少到:

ADM_.BHZ.SAC 
AMM_.BHZ.SAC 
ASI_.BHE.SAC 
ASI_.BHZ.SAC 

這正是我想要的。我想,有點笨拙,但它有效。現在問題發生在我有如下文件:

2010.306.18.06.12.8195.TW.MASB..BHE.SAC 
2010.306.18.06.14.7695.TW.CHGB..BHN.SAC 
2010.306.18.06.24.4195.TW.NNSB..BHZ.SAC 
2010.306.18.06.25.0695.TW.SSLB..BHZ.SAC 

它們存在於同一個文件夾中。例如,我一直試圖在rename命令中使用通配符來獲得類似的結果。 rename 2010.306.18.*.*.*.*. ""但這種附加的2010.306.18.*.*.*.*.首次出現的所有其他文件的開頭 - 顯然不是我後,這樣我得到:

2010.306.18.06.12.8195.TW.MASB..BHE.SAC 
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.14.7695.TW.CHGB..BHN.SAC 
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.24.4195.TW.NNSB..BHZ.SAC 
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.25.0695.TW.SSLB..BHZ.SAC 

我想我不理解通配符的一個相當基本原則在這裏,有人可以解釋爲什麼這不起作用,我可以做些什麼來獲得理想的結果(最好使用rename)。


N.B.

爲了澄清,輸出希望成爲:

ADM_.BHZ.SAC 
AMM_.BHZ.SAC 
ASI_.BHE.SAC 
ASI_.BHZ.SAC 
MASB.BHE.SAC 
CHGB.BHN.SAC 
NNSB.BHZ.SAC 
SSLB.BHZ.SAC 

回答

3

rename不允許什麼命令fromto字符串中的通配符秒。當您運行rename 2010.306.18.*.*.*.*. "" *時,它實際上是您的shell,它首先擴展通配符,然後將擴展結果傳遞到rename,因此它不起作用。

for file in * 
do 
    tmp="${file##2010*TW.}" # remove the file prefix 
    mv "$file" "${tmp/../_}" # replace dots with underscore 
done 
15
for f in *; do mv $f `echo $f | sed 's/2010.*.TW.//'` ; done 

第一次嘗試

for f in *; do echo mv $f `echo $f | sed 's/2010.*.TW.//'` ; done 

,看你要exec的

+0

很多感謝一個完整的答案,包括如何預覽命令:

而不是使用rename的,如下使用循環。 –