如何在Bash文件名中填充填充数字?
问题描述:
什么是最好的方式,使用bash,以形式重命名文件:如何在Bash文件名中填充填充数字?
(foo1, foo2, ..., foo1300, ..., fooN)
用零填充文件名:
(foo00001, foo00002, ..., foo01300, ..., fooN)
答
万一N
不是先验固定的:
for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done
答
下面将做到这一点:
for i in ((i=1; i<=N; i++)) ; do mv foo$i `printf foo%05d $i` ; done
编辑:改为使用((i = 1,...)),谢谢mweerden!
答
这里有一个假设固定长度前缀(你的“foo”)和固定长度填充的快速解决方案。如果你需要更多的灵活性,也许这至少是一个有益的起点。
#!/bin/bash
# some test data
files="foo1
foo2
foo100
foo200
foo9999"
for f in $files; do
prefix=`echo "$f" | cut -c 1-3` # chars 1-3 = "foo"
number=`echo "$f" | cut -c 4-` # chars 4-end = the number
printf "%s%04d\n" "$prefix" "$number"
done
答
纯击,不是 'MV' 之外,没有其他的外部进程:
for file in foo*; do
newnumber='00000'${file#foo} # get number, pack with zeros
newnumber=${newnumber:(-5)} # the last five characters
mv $file foo$newnumber # rename
done
答
我有一个更复杂的情况下,当文件名有一个后缀以及一个前缀,我还需要从文件名中减去数字。所以我想让foo56.png成为foo00000055.png。我希望这可以帮助你做更复杂的事情。
#!/bin/bash
for file in foo[0-9]*.png; do
# strip the prefix ("foo") off the file name
postfile=${file#foo}
# strip the postfix (".png") off the file name
number=${postfile%.png}
# subtract 1 from the resulting number
i=$((number-1))
# copy to a new name in a new folder
cp ${file} ../newframes/$(printf foo%08d.png $i)
done
答
这不是纯粹的庆典,但与rename
命令要容易得多:
rename 's/\d+/sprintf("%05d",$&)/e' foo*
+0
它也用空格处理文件名。 – palacsint 2013-10-19 10:03:21
答
我用的ONELINE命令是这样的:
ls * | cat -n | while read i f; do mv "$f" `printf "PATTERN" "$i"`; done
模式可以是例如:
- 用增量重命名换货计数器:
%04d.${f#*.}
(保留原始文件扩展名) - 重命名递增计数器前缀:
photo_%04d.${f#*.}
(保留原分机) - 与增量计数器和变化扩展名重命名为JPG:
%04d.jpg
- 重命名前缀和增量计数器文件名前缀:
photo_$(basename $f .${f#*.})_%04d.${f#*.}
- ...
可以过滤与例如ls *.jpg | ...
您可用的变量f
是文件名,i
是计数器。
对于你的问题正确命令是:
ls * | cat -n | while read i f; do mv "$f" `printf "foo%d05" "$i"`; done
代替使用SEQ我建议写的(第(i = 1; I mweerden 2008-09-11 06:18:46