我想对文件名进行零填充。我正在使用这个脚本这里。
#!/bin/bash
num=`expr match "$1" '[^0-9]*\([0-9]\+\).*'`
paddednum=`printf "%03d" $num`
echo ${1/$num/$paddednum}
此脚本输出文件名,前面的数字用零填充:
$ zeropad "folder01/01.jpg"
folder001/01.jpg
但我想像这样对后面的数字进行零填充:
$ zeropad "folder01/01.jpg"
folder01/001.jpg
我该怎么做?是否有一个网页可以让我看到很多 Bash 模式匹配的示例?
答案1
path="folder01/01.jpg"
dir=$(dirname "$path")
file=$(basename "$path")
ext=${file##*.}
file=${file%.*}
# assume file is composed of digits here
printf -v newname "%s/%03d.%s" "$dir" $file "$ext"
echo "$newname"
答案2
您应该分成folder01/01.jpg
两个字符串:folder01
和01.jpg
,进行更改,01.jpg
最后再次将它们放在一起:
#!/bin/bash
dir=`echo $1 | cut -d/ -f 1` #or dir=`dirname $1`
file=`echo $1 | cut -d/ -f 2` #or file=`basename $1`
num=`expr match "$file" '[^0-9]*\([0-9]\+\).*'`
paddednum=`printf "%03d" $num`
echo "$dir/${file/$num/$paddednum}"
Google 是您查找许多网页(不仅仅是一个)的朋友,您可以在其中看到大量 Bash 模式匹配的示例。其实这类问题都是无关这里。
答案3
每当我看到正则表达式问题时,我的第一反应就是 Perl:
for file in folder01/*.jpg;do
echo "$file"|perl -pe 's/([0-9]+)([^0-9]+)\Z/sprintf "%03d%s",$1,$2/e'
done
这并不假设您的文件名仅由数字组成。