일부 폴더와 하위 폴더에 1,000,000개의 파일이 있습니다. 쉘 명령을 사용하여 소문자에서 대문자로 이름을 바꾸고 싶습니다. 확장자를 변경하고 싶지 않습니다. 파일 이름 부분만.
나는 이것을 찾았다:
rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/' *
그러나 재귀적이지 않으며 현재 폴더의 파일에서만 작동합니다.
그런 다음 이것을 시도했습니다.
find . -depth -execdir rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/' {} \;
그러나 파일이 변경되지 않았습니다.
어떻게 재귀적으로 사용할 수 있나요?
답변1
Debian과 그 파생 배포판(예: Debian 및 Ubuntu)에서 제공하는 Perl 이름 변경 기능이 있다고 가정하면 거의 다 왔습니다. 문제는 -execdir
접두사가 붙은 파일 이름을 전달하는 것 입니다 ./
. (이유는 일부 명령이 특정 문자로 시작하는 인수를 특별히 처리하기 때문입니다. 이렇게 하면 이름이 파일인 경우 -foo
파일로 전달되므로 ./-foo
옵션이 아닌 파일로 처리됩니다.) 정규식을 사용하면 다음과 같습니다. 결과는 $1
항상 비어 있으므로 새 이름은 이전 이름과 동일합니다.
./
이것을 정규식에 적용하세요.
find . -depth -execdir rename 's/^(\.\/[^.]*)\.(.*)$/\U$1\E.$2/' {} \;
답변2
find . -type f -exec rename -v 's/(\w+).(\w+)$/\U$1\E.$2/' {} \;
답변3
이 작은 bash 스크립트를 사용할 수 있습니다.
#!/bin/bash
find . -type f -exec sh -c '
dn=`dirname "$1"`
bn=`basename "$1"`
fn=`echo "${bn%.*}"`
ext=`echo "${bn##*.}"`
FN=`echo "${fn^^}"`
newfn="${FN}"."${ext}"
#echo ${dn}/$newfn
if [ "${fn}" = "${FN}" ] ;then : ;else echo "${bn} renamed to ${newfn}";mv "$1" "${dn}/${newfn}";fi
' _ {} \;
답변4
ls -r | rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/'
이거 괜찮아?