0 で埋められたファイル名と一致する Bash スクリプトのパターン

0 で埋められたファイル名と一致する 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パターンマッチングの多くの例を見ることができるWebページはありますか?

答え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.jpg2つの文字列に分割して変更し、folder01最後にもう一度合わせる必要があります。01.jpg01.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パターンマッチングの多数の例を見ることができる多くのWebページ(ただ1つではない)を見つける友人です。実際、この種の問題は無関係ここで。

答え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

これは、ファイル名が数字のみで構成されているとは仮定しません。

関連情報