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/' {}/* \;

{}rename을 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(전혀 확장된 경우 - 일치하는 항목이 있는지 의심됨 {}/*) 확장되지 않은 경우 실행되는 명령은 , 및 rename3개의 인수를 사용 합니다 . 마지막 인수는 기존 파일의 이름이 아니므로 아무 작업도 수행하지 않습니다.-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`}, ".")'

관련 정보