Bash - "Image (x).png" 파일 이름 바꾸기

Bash - "Image (x).png" 파일 이름 바꾸기

Image.png, Image (2).png, 와 같은 Windows 스캔 파일이 많이 있습니다 ... Image (19).png.

Image01.png ... Image19.png변환 명령에 던져서 imagemagick출력 PDF에 순차적으로 페이징되도록 이름을 바꿔야 합니다 .

이것은 내가 사용한 명령입니다.

ls * | awk '{print "mv \""$0"\" \"2"$0"2\"" }' | sed -e 's/2Image (/Image0/' | sed -e 's/).png2/.png/' | sed -e 's/[0-9]\([0-9][0-9]\)/\1/' | sed -e 's/2Image.png2/Image01.png/' | sh

2이것은 작동하지만 이름 바꾸기 작업을 수행하기 위해 임의의 문자를 삽입하는 것과 같은 더럽거나 버그가 있는 자리 표시자를 사용하지 않는 보다 깔끔한 방법이 있습니다 .

답변1

rename 's/^Image\.png$/Image01.png/ || s/^Image\s+\((\d+)\)\.png$/sprintf "%s%02d.png", "Image", $1/e' *.png

방법

  • rename유틸리티는 귀하의 시나리오에 가장 적합한 선택입니다. 작업 모델은 다음과 같습니다. 파일 이름 목록을 가져오고 Perl각 파일 이름에 유효한 변환을 적용하면 변환 결과가 파일 이름의 새 이름이 됩니다.
  • s/^Image.png$/Image(01).png/ => Image.png 파일을 처리하는 데 사용됩니다.
  • s/^Image\s+((\d+)).png$/ => Image로 시작하는 파일 이름, 하나 이상의 공백, 그 뒤에 리터럴 왼쪽 대괄호(및 하나 이상의 숫자\ d+ 및 a)가 오는 파일 이름과 일치합니다. 닫는 괄호) .png로 끝납니다.

답변2

파일이 호출된다는 것을 알고 있으므로 Image.png정규식 Image (2).pngImage (19).png필요하지 않습니다.

mv Image.png Image01.png
for i in {2..19}; do
    zi=$( printf '%02d' "$i" )
    mv "Image ($i).png" "Image$zi.png"
done

$zi의 제로 패딩된 2자 와이드 정수 버전이 됩니다 $i.

관련 정보