如何在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* 

我有一个更复杂的情况下,文件名有一个后缀以及一个前缀,我也需要从文件名减去数字。 所以我想foo​​56.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