비슷한 질문이 많이 나왔습니다. 그 벌레가 아마 내 얼굴을 노려보고 있을 텐데, 난 그냥 볼 수가 없어…
#!/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
. 출력 파일은 $newfilename
37.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.jpg
46jpg
.
질문의 다른 부분에 대해서는
//
다음 항목을 모두 바꾸십시오.무늬, /
첫 번째 것만 대체합니다. 예를 들어,
$ i=cataract
$ echo "${i/a/X}"
cXtaract
$ echo "${i//a/X}"
cXtXrXct
답변2
rename
Perl (때때로 Perl이라고도 함 ) 이 있는 경우 prename
다음을 수행할 수 있습니다.
rename -v 's!(\d+)(.*)\.jpg$!sprintf "%d%s.png", $1+36, $2!e' *.jpg
이는 각 파일 이름을 가져와서 선행 숫자, 파일 이름 구성 요소의 나머지 부분 및 후행 숫자를 분할합니다 .jpg
. 그런 다음 숫자 부분에 36을 추가하고 원래 파일 이름의 나머지 부분을 추가하고 접미사를 .png
.
rename -n ...
이 항목의 내용을 변경하면 어떤 일이 발생하는지 확인 하거나 삭제하여 -v
자동으로 실행되도록 할 수 있습니다.