我正在嘗試編寫一個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不是一個目錄。 任何幫助將是非常讚賞。謝謝。
我正在嘗試編寫一個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不是一個目錄。 任何幫助將是非常讚賞。謝謝。
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
頁。
amzazing !!非常感謝你 – Glove 2012-03-02 04:10:39
如果沒有太多的問題你能解釋爲什麼''{i%.a} _a.img「' – Glove 2012-03-02 04:13:06
@biz:增加了一些解釋,所以它不僅對你來說是黑魔法。 – 0xC0000022L 2012-03-02 04:15:22
'mv'不是這個魔法。 [Larry Wall在Perl中編寫了一個重命名腳本](http://docstore.mik.ua/orelly/perl/cookbook/ch09_10.htm),這可能更加神奇,但每次都需要編寫一小段Perl代碼你用吧。 – sarnold 2012-03-02 03:57:18