파일 이름을 소문자에서 대문자로 반복적으로 변경합니다.

파일 이름을 소문자에서 대문자로 반복적으로 변경합니다.

일부 폴더와 하위 폴더에 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/'

이거 괜찮아?

관련 정보