如何在Bash文件名中填充填充数字?

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

+0

代替使用SEQ我建议写的(第(i = 1; I mweerden 2008-09-11 06:18:46

这里有一个假设固定长度前缀(你的“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