2012-03-02 114 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