2014-10-03 98 views
1

我使用以下命名約定在目錄中有100個文件。重命名多個文件,同時在linux中保留相同的擴展名

00XYZCD042ABCDE20141002ABCDE.XML 
00XYZCC011ABCDE20141002.TXT 
00XYZCB165ABCDE20141002ABCDE.TXT 
00XYZCB165ABCDE20141002ABCDE.CSV 

我想用重命名這些文件bashawkcutsed 所以我得到的輸出

XYZCD042.XML 
XYZCC011.TXT 
XYZCB165.TXT 
XYZCB165.CSV 

所以基本上去除前2 0始終,然後讓一切直到ABCDE啓動,然後刪除包括ABCDE在內的所有內容並保留文件擴展名。

請幫助 千恩萬謝

回答

2
for i in *; do 
    mv $i $(echo $i | sed -e 's/^00//' -e 's/ABCDE2014[^.]*//'); 
done 
6

猛砸只:

for fn in *; do 
    A=${fn#00} 
    mv $fn ${A/ABCDE*./.} 
done 

在for循環的第一行剝離的00前綴,而第二行剝離的ABCDE後綴(最多點),然後執行重命名。

+0

+1,只是指出它也適用於zsh和ksh,也可能是其他一些我無法想到的。 – terdon 2014-10-03 14:10:44

+0

如果你添加了解釋,這將是一個'rockin''答案。 – dawg 2014-10-04 04:03:11

+0

@dawg:好的,確實如此。 – nneonneo 2014-10-04 07:29:45

6

你可以試試下面的命令rename

rename 's/ABCDE.*(\..*)/$1/;s/^00//' * 

說明:

  • s/ABCDE.*(\..*)/$1/比賽從第一ABCDE高達最後所有的人物和僅捕獲延伸部分。然後將所有匹配的字符替換爲捕獲的擴展名。
  • s/^00//然後這將刪除前兩個零。
4
for file in * 
do 
    mv -- "$file" "${file:2:8}.${file#*.}" 
done 

它總是引用您的變量,除非你心裏有一個特定的目的和理解所有的影響是很重要的。

相關問題