如何在Bash文件名中填充填充数字?
什么是最好的方式,使用Bash,以下面的forms重命名文件:
(foo1, foo2, ..., foo1300, ..., fooN)
使用零填充的文件名称:
(foo00001, foo00002, ..., foo01300, ..., fooN)
在N
不是先验固定的情况下:
for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done
这不是纯粹的bash,但更容易使用rename
命令:
rename 's/\d+/sprintf("%05d",$&)/e' foo*
我有一个更复杂的情况下,文件名有一个后缀以及一个前缀,我也需要从文件名减去数字。 所以我想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
纯粹的Bash,除了“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
以下将做到这一点:
for i in ((i=1; i<=N; i++)) ; do mv foo$i `printf foo%05d $i` ; done
编辑:改为使用((i = 1,…)),谢谢!
这是一个快速的解决scheme,假定一个固定长度的前缀(你的“foo”)和固定长度的填充。 如果你需要更多的灵活性,也许这至less是一个有益的起点。
#!/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
我使用的oneline命令是这样的:
ls * | cat -n | while read if; do mv "$f" `printf "PATTERN" "$i"`; done
PATTERN可以是例如:
- 用增量计数器重命名:
%04d.${f#*.}
(保留原始文件扩展名) - 用增量计数器重命名,前缀为:
photo_%04d.${f#*.}
(保留原始扩展名) - 用增量计数器重命名,并将扩展名更改为jpg:
%04d.jpg
- 用带有前缀和文件基名的增量计数器重命名:
photo_$(basename $f .${f#*.})_%04d.${f#*.}
- …
您可以过滤文件以重命名,例如ls *.jpg | ...
ls *.jpg | ...
你有可用的variablesf
是文件名, i
是计数器。
对于你的问题,正确的命令是:
ls * | cat -n | while read if; do mv "$f" `printf "foo%d05" "$i"`; done