在文件名中添加两次前导零

时间:2016-11-23 15:08:07

标签: linux bash rename leading-zero

我有文件名(来自图像图块),由两个由下划线分隔的数字组成,例如:

142_27.jpg
7_39.jpg
1_120.jpg

我如何(在linux中)为这两个数字添加前导零?我想要的是文件名

142_027.jpg
007_039.jpg
001_120.jpg

4 个答案:

答案 0 :(得分:2)

您可以使用单个awk命令使用printf格式化带有前导零的文件名:

for f in *.jpg; do
   echo mv "$f" $(awk -F '[_.]' '{printf "%03d_%03d.%s", $1, $2, $3}' <<< "$f")
done

这将输出:

mv 142_27.jpg 142_027.jpg
mv 1_120.jpg 001_120.jpg
mv 7_39.jpg 007_039.jpg

如果您对输出感到满意,请在echo命令之前删除mv

答案 1 :(得分:1)

使用基于perl的{​​{1}}命令

rename

$ touch 142_27.jpg 7_39.jpg 1_120.jpg $ rename -n 's/\d+/sprintf "%03d", $&/ge' *.jpg rename(1_120.jpg, 001_120.jpg) rename(142_27.jpg, 142_027.jpg) rename(7_39.jpg, 007_039.jpg) 选项用于空运行,将其删除以进行实际重命名


如果基于-n的{​​{1}}命令不可用:

perl

干燥运行似乎没问题后,将rename更改为$ for f in *.jpg; do echo mv "$f" "$(echo "$f" | perl -pe 's/\d+/sprintf "%03d", $&/ge')"; done mv 1_120.jpg 001_120.jpg mv 142_27.jpg 142_027.jpg mv 7_39.jpg 007_039.jpg

答案 2 :(得分:0)

您可以使用sed:

使用一些shell脚本来完成
for i in *.jpg;
do
    new=`echo "$i" | sed -n -e '{ s/^\([0-9]\{0,3\}\)_\([0-9]\{0,3\}\).jpg/000\1_000\2.jpg/ };
    {s/\([0-9]*\)\([0-9]\{3\}\)_\([0-9]*\)\([0-9]\{3\}\).jpg/\2_\4.jpg/p };'`;
    mv "$i" "$new";
done;

我首先在默认情况下在所述位置附加三个前导零,然后在所述位置开始切断必要的数字,以便只留下3位数

答案 3 :(得分:0)

使用 bash 替换(a,b)

windows(bash)

for f in *.jpg;do a=${f%_*};b=${f#*_};mv $f $(printf "%03d_%07s" $a $b);done

Linux

for f in *.jpg;do a=${f%_*};b=${f#*_};b=${b%.*};mv $f $(printf "%03d_%03d".jpg $a $b);done