Bash 脚本中的模式与零填充文件名匹配

Bash 脚本中的模式与零填充文件名匹配

我想对文件名进行零填充。我正在使用这个脚本这里

#!/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两个字符串:folder0101.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

这并不假设您的文件名仅由数字组成。

相关内容