0으로 채워진 파일 이름과 일치하는 Bash 스크립트의 패턴

0으로 채워진 파일 이름과 일치하는 Bash 스크립트의 패턴

파일 이름을 제로 패드하고 싶습니다. 이 스크립트를 사용하고 있습니다여기.

#!/bin/bash
num=`expr match "$1" '[^0-9]*\([0-9]\+\).*'`
paddednum=`printf "%03d" $num`
echo ${1/$num/$paddednum}

이 스크립트는 앞에 숫자가 0으로 채워져 파일 이름을 출력합니다.

$ 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.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 패턴 일치의 수많은 예를 볼 수 있는 많은 웹페이지(단지 하나가 아님)를 찾아주는 친구입니다. 실제로 이러한 유형의 문제는관련 없는여기.

답변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

이는 파일 이름이 숫자로만 구성되어 있다고 가정하지 않습니다.

관련 정보