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