2012-03-02 40 views
0

我正在嘗試編寫一個bourne-shell腳本,它將一個目錄作爲參數並查找名爲ixxx.a的圖像並將它們重命名爲ixxx_a.img,其中「xxx表示分機號碼爲例圖像文件將被命名爲i001.a,i002.a,i003.a ...) 這裏是我的嘗試在bourne shell中重命名文件

mv $1/f[0-9][0-9][0-9].a $1/f[0-9][0-9][0-9]_a.img 

,但它說,DEST不是一個目錄。 任何幫助將是非常讚賞。謝謝。

+0

'mv'不是這個魔法。 [Larry Wall在Perl中編寫了一個重命名腳本](http://docstore.mik.ua/orelly/perl/cookbook/ch09_10.htm),這可能更加神奇,但每次都需要編寫一小段Perl代碼你用吧。 – sarnold 2012-03-02 03:57:18

回答

1
for i in $1/f[0-9][0-9][0-9].a; do 
    mv $i ${i%.a}_a.img 
done 

但是,這不考慮文件/文件夾名稱中的空格。在這種情況下,您必須使用while,以便每行獲得一個文件名(請參閱下面的紅利)。可能有幾十種其他方式,包括rename

find $1 -maxdepth 1 -type f -name "f[0-9][0-9][0-9].a"|while read i; do 
    mv "$i" "${i%.a}_a.img" 
done 

編輯:也許我應該解釋我做了什麼那裏。這就是所謂的字符串替換和主要用例,這些對於一個變量var

# Get first two characters 
${var:0:2} 
# Remove shortest rear-anchored pattern - this one would give the directory name of a file, for example 
${var%/*} 
# Remove longest rear-anchored pattern 
${var%%/*} 
# Remove shortest front-anchored pattern - this in particular removes a leading slash 
${var#/} 
# Remove longest front-anchored pattern - this would remove all but the base name of a file given its path 
# Replace a by b 
${var//a/b} 
${var##*/} 

更多看到man頁。

+0

amzazing !!非常感謝你 – Glove 2012-03-02 04:10:39

+0

如果沒有太多的問題你能解釋爲什麼''{i%.a} _a.img「' – Glove 2012-03-02 04:13:06

+1

@biz:增加了一些解釋,所以它不僅對你來說是黑魔法。 – 0xC0000022L 2012-03-02 04:15:22