
ファイル名をゼロパッドしたいです。このスクリプトを使用していますここ。
#!/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.jpg
2つの文字列に分割して変更し、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パターンマッチングの多数の例を見ることができる多くの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
これは、ファイル名が数字のみで構成されているとは仮定しません。