Bash는 find -exec를 사용하여 360,000개의 파일 이름을 바꿉니다.

Bash는 find -exec를 사용하여 360,000개의 파일 이름을 바꿉니다.

약 360,000개의 파일이 있습니다. 예를 들면 다음과 같습니다.

./001/1/1.jpg
./001/1/2.jpg
./001/2/1.jpg
./002/1/1.jpg
./003/1/1.jpg
...
pattern: [60 dirs]/[1000 subdirs]/[4-10 files].jpg

rename예를 들어 파일 이름을 *.jpg에서 *.jpeg로 바꾸고 싶습니다 . rename인수 목록이 너무 길다는 오류가 발생하기 때문에 Single을 사용하여 이 작업을 수행할 수 없습니다 .

해결책을 찾는 동안 이것을 찾았지만 이름은 바뀌지 않았습니다.

find -maxdepth 2 -mindepth 2 -type d -exec rename -n 's/jpg/jpeg/' {}/* \;

확장 되었는지 확인할 때 {}이름 바꾸기를 echo로 바꾸세요.

find -maxdepth 2 -mindepth 2 -type d -exec echo "rename -n 's/jpg/jpeg/' {}/*" \;

예상되는 결과를 얻습니다.

rename -n 's/jpg/jpeg/' ./061/61430/*
rename -n 's/jpg/jpeg/' ./061/61431/*
...

이러한 이름 바꾸기 명령을 실행하면 작업 이름이 변경됩니다. 그래서 그것이 질문이 되어야 합니다 {}.

도와주셔서 감사합니다!

답변1

첫 번째 경우 명령 은 , 및 세 개의 인수를 사용하여 실행 *됩니다 . 마지막 인수는 기존 파일의 이름이 아니므로 아무 작업도 수행하지 않습니다.rename{}/*rename-ns/jpg/jpeg/some/path/*rename

쉘 와일드카드가 없으면 경로는 rename.

따라서 다음을 수행하십시오.

find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +

find+가능할 때마다 대신 명령줄을 작성하는 기능을 사용하십시오 ;.

답변2

find  | prename 's/\.jpg$/.jpeg/'

또는 현재 디렉터리에 주문 파일이 있는 경우

find 0[0-9][0-9] | prename 's/\.jpg$/.jpeg/'

답변3

type d디렉토리 이름을 바꾸려는 경우가 아니면 이를 지정해서는 안 됩니다. 확장자를 변경 하려면 다음을 .jpg시도해 보세요..jpeg

find . -maxdepth 2 -mindepth 2 -name '*.jpg' -exec sh -c 'echo mv -- "$0" "${0%%.jpg}.jpeg"' {} \;

echo화면에 표시되는 내용이 마음에 들면 삭제하세요.

답변4

cygwin을 사용하면 이름이 변경된 버전에 정규식 대체가 없으며 해당 rename [options] expression replacement file...구문도 작동하지 않는 것 같습니다. 또한 bash 제안이 실패합니다.

... -c: line 0: unexpected EOF while looking for matching `"'
... -c: line 1: syntax error: unexpected end of file

아아... 항상 Perl이 있습니다.

perl -MFile::Find -e 'find(sub{return unless /^(.*)\.jpg$/;`mv $_ $1.jpeg`}, ".")'

관련 정보