它不是纯粹的bash,但使用rename
命令更容易:
rename 's/\d+/sprintf("%05d",$&)/e' foo*
如果N
不是先验固定:
for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done
我有一个更复杂的案例,文件名有一个后缀和一个前缀.我还需要对文件名中的数字进行减法.
例如,我想foo56.png
成为foo00000055.png
.
我希望如果你做的事更复杂,这会有所帮助.
#!/bin/bash prefix="foo" postfix=".png" targetDir="../newframes" paddingLength=8 for file in ${prefix}[0-9]*${postfix}; do # strip the prefix off the file name postfile=${file#$prefix} # strip the postfix off the file name number=${postfile%$postfix} # subtract 1 from the resulting number i=$((number-1)) # copy to a new name with padded zeros in a new folder cp ${file} "$targetDir"/$(printf $prefix%0${paddingLength}d$postfix $i) done
我使用的oneline命令是这样的:
ls * | cat -n | while read i f; do mv "$f" `printf "PATTERN" "$i"`; done
PATTERN可以是例如:
使用增量计数器重命名:( %04d.${f#*.}
保留原始文件扩展名)
使用带前缀的增量计数器重命名:( photo_%04d.${f#*.}
保留原始扩展名)
使用增量计数器重命名并将扩展名更改为jpg: %04d.jpg
使用带有前缀和文件basename的增量计数器重命名: 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