在文件名中添加两次前导零
Add leading zeros twice in filename
我有文件名(来自图像块)由两个数字组成,用下划线分隔,例如
142_27.jpg
7_39.jpg
1_120.jpg
我如何(在 linux 中)为这两个数字添加前导零?我想要的是文件名
142_027.jpg
007_039.jpg
001_120.jpg
您可以使用单个 awk
命令使用 printf
:
来格式化带有前导零的文件名
for f in *.jpg; do
echo mv "$f" $(awk -F '[_.]' '{printf "%03d_%03d.%s", , , }' <<< "$f")
done
这将输出:
mv 142_27.jpg 142_027.jpg
mv 1_120.jpg 001_120.jpg
mv 7_39.jpg 007_039.jpg
一旦您对输出感到满意,请在 mv
命令之前删除 echo
。
使用基于perl
的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
选项用于干运行,删除它以进行实际重命名
如果基于 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
干燥后将 echo mv
更改为 mv
运行 似乎还可以
你可以用一些 shell-script 使用 sed:
for i in *.jpg;
do
new=`echo "$i" | sed -n -e '{ s/^\([0-9]\{0,3\}\)_\([0-9]\{0,3\}\).jpg/000_000.jpg/ };
{s/\([0-9]*\)\([0-9]\{3\}\)_\([0-9]*\)\([0-9]\{3\}\).jpg/_.jpg/p };'`;
mv "$i" "$new";
done;
我首先默认在上述位置附加三个前导零,然后根据需要切断尽可能多的数字,在上述位置开始,以便只剩下 3 位数字
用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
我有文件名(来自图像块)由两个数字组成,用下划线分隔,例如
142_27.jpg
7_39.jpg
1_120.jpg
我如何(在 linux 中)为这两个数字添加前导零?我想要的是文件名
142_027.jpg
007_039.jpg
001_120.jpg
您可以使用单个 awk
命令使用 printf
:
for f in *.jpg; do
echo mv "$f" $(awk -F '[_.]' '{printf "%03d_%03d.%s", , , }' <<< "$f")
done
这将输出:
mv 142_27.jpg 142_027.jpg
mv 1_120.jpg 001_120.jpg
mv 7_39.jpg 007_039.jpg
一旦您对输出感到满意,请在 mv
命令之前删除 echo
。
使用基于perl
的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
选项用于干运行,删除它以进行实际重命名
如果基于 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
干燥后将 echo mv
更改为 mv
运行 似乎还可以
你可以用一些 shell-script 使用 sed:
for i in *.jpg;
do
new=`echo "$i" | sed -n -e '{ s/^\([0-9]\{0,3\}\)_\([0-9]\{0,3\}\).jpg/000_000.jpg/ };
{s/\([0-9]*\)\([0-9]\{3\}\)_\([0-9]*\)\([0-9]\{3\}\).jpg/_.jpg/p };'`;
mv "$i" "$new";
done;
我首先默认在上述位置附加三个前导零,然后根据需要切断尽可能多的数字,在上述位置开始,以便只剩下 3 位数字
用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