파일 일괄 이름 바꾸기가 작동하지 않습니다.

파일 일괄 이름 바꾸기가 작동하지 않습니다.

비슷한 질문이 많이 나왔습니다. 그 벌레가 아마 내 얼굴을 노려보고 있을 텐데, 난 그냥 볼 수가 없어…

#!/bin/bash
declare -a files
shopt -s nullglob       
files=(*)
count=36   # offset

for oldfilename in "${files[@]}"; do
    (( count++ ))
#   newfilename=$(echo "$oldfilename" | sed -e "s/^[1-9][0-9]?\.jpg/Scount\.png/")
#   newfilename=${oldfilename/[1-9][0-9]?/Scount}
#   newfilename=${oldfilename/[1-9][0-9]?/"Scount"}
    newfilename=${oldfilename//[1-9][0-9]?/Scount}
    echo mv -fv /path1/to/"${oldfilename}" /path2/to/"${newfilename}"
done
exit 0

나는 그 줄에 주석을 달려고 노력했다. /와 의 //차이점을 모르겠습니다 newfilename=${oldfilename/[1-9][0-9]?/"Scount"}. o_0?

편집하다: 로 표시되는 파일의 $oldfilename형식 1.jpg은 입니다 99.jpg. 출력 파일은 $newfilename37.png ~ 135.png 형식이어야 합니다(적어도 호출에 관한 한 sed).
어떻게 든 파일 이름이 바뀌지 않았고 점이 .jpg사라졌습니다. 왜 이것이 작동하지 않습니까?

답변1

sed나는 당신이 regex: 를 일치시키고 바꾸려는 당신의 (주석 처리된) 명령 [1-9][0-9]?에서 추측하고 있습니다.

  • 0이 아닌 숫자( [1-9]) 다음에
  • 0 또는 한 자리( [0-9]?)

이는 1에서 99 사이의 정수(앞에 0이 붙지 않음)에 대해 작동하는 매우 일반적인 정규식입니다. 그러나 정규식을 사용하는 대신 경로 이름 확장 패턴(와일드카드라고도 함)을 사용합니다. 그러니까 그 뜻은${parameter/pattern/string}[1-9][0-9]?

  • 0이 아닌 숫자( [1-9]) 다음에
  • 숫자( [0-9]), 그 뒤에
  • 임의의 문자( ?)

그래도 두 자리 파일 이름에는 작동하지만 ( 없이 ) 사용하고 이름 을 .바꿉니다 .10.jpg46jpg.


질문의 다른 부분에 대해서는 //다음 항목을 모두 바꾸십시오.무늬, /첫 번째 것만 대체합니다. 예를 들어,

$ i=cataract
$ echo "${i/a/X}"
cXtaract
$ echo "${i//a/X}"
cXtXrXct

답변2

renamePerl (때때로 Perl이라고도 함 ) 이 있는 경우 prename다음을 수행할 수 있습니다.

rename -v 's!(\d+)(.*)\.jpg$!sprintf "%d%s.png", $1+36, $2!e' *.jpg

이는 각 파일 이름을 가져와서 선행 숫자, 파일 이름 구성 요소의 나머지 부분 및 후행 숫자를 분할합니다 .jpg. 그런 다음 숫자 부분에 36을 추가하고 원래 파일 이름의 나머지 부분을 추가하고 접미사를 .png.

rename -n ...이 항목의 내용을 변경하면 어떤 일이 발생하는지 확인 하거나 삭제하여 -v자동으로 실행되도록 할 수 있습니다.

관련 정보