2016-11-23 35 views
-2

我有两个由下划线分隔的数字组成的文件名(来自图像磁贴),例如:在文件名中加上两位前导零

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

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

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

'perldoc -f sprintf' – toolic

+0

您正在寻找重命名文件或更改文件中的文本? – Sundeep

+0

重命名文件。我发现了许多用于将零添加到文件名开头的示例,但是在这里我想在两处(在开头和下划线之后)放置零。 – user1583209

回答

1

随着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一次预演似乎还好

2

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

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 

一旦您对输出满意,请在mv命令前删除echo

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; 

我第一次在默认情况下,事后上述场所切断作为追加三个主要零许多数字必要时在上述位置开始brigning,以便只剩下3位数