我正在尝试编写一个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