2017-01-14 53 views
0

我有很多jpg文件的名稱中包含字母和數字。我想刪除所有字母,例如abc12d34efg.jpg變爲1234.jpg。對於for循環我想:通過刪除字母從shell重命名文件

for i in *.jpg; do mv "$i" ... 

但我無法找到我想要的命令。

+0

有點脫離主題,但可以是有用的:有一個名爲mmv的命令,它爲您的目標服務,沒有數據丟失的風險。 – linuxfan

回答

0

下面是一個使用tr

for f in *.jpg ; do n="$(echo ${f} | tr -d a-zA-Z)" ; mv "$f" "${n}jpg" ; done 

有了一些格式化它看起來就像是

for f in *.jpg ; do 
    n="$(echo ${f} | tr -d a-zA-Z)" 
    mv "$f" "${n}jpg" 
done 

這裏是發生了什麼事一個ONELINE解決方案:

首先我們從刪除所有字母名字使用tr -d a-zA-Z。從abc12d34efg.jpg我們得到1234.(末尾有一個點,因爲.不屬於a-zA-Z間隔),並將此值分配給變量$n。 T

然後我們可以將$f重命名爲${n}jpg。而已。

更新同時刪除小寫和大寫字母使用tr -d a-zA-Z,只刪除小寫字母使用tr -d a-z代替。

+0

謝謝!它的工作原理,但我必須執行另一個大寫字母Cicle,無論如何非常好的解釋! – druido82

+0

@ druido82歡迎來到Stack Overflow。如果答案解決了您的問題,歡迎您通過勾選答案旁邊的複選標記來接受答案。 –

1

隨着殼參數擴展:

for fname in *.jpg; do mv "$fname" "${fname//[[:alpha:]]}jpg"; done 

"${fname//[[:alpha:]]}"[[:alpha:]](任何字母)的所有出現什麼也沒有的取代。因爲這也刪除了jpg,我們必須再次添加它–附加jpg這樣做。

1

您可以使用sed將所有字母都替換爲正則表達式。

for i in *.jpg; do mv $i `echo $i | sed -e 's/[a-zA-Z]//g'`jpg; done 
+0

如果文件名包含空格,將會失敗 –