[linux] Linux에서 모든 폴더와 파일의 이름을 소문자로 바꾸려면 어떻게합니까?

대문자 폴더가 어디에도 나타나지 않도록 전체 폴더 트리의 이름을 재귀 적으로 바꿔야합니다 (C ++ 소스 코드이지만 중요하지는 않습니다).

CVS 및 Subversion 버전 제어 파일 / 폴더를 무시하기위한 보너스 포인트. 쉘은 모든 Linux 상자에서 사용 가능해야하므로 쉘 스크립트가 선호됩니다.

파일 이름 변경에 대한 세부 사항에 대한 몇 가지 유효한 인수가있었습니다.

  1. 소문자 이름이 같은 파일은 덮어 써야한다고 생각합니다. 그것은 사용자의 문제입니다. 대소 문자를 무시하는 파일 시스템에서 체크 아웃하면 첫 번째 파일 시스템도 덮어 씁니다.

  2. AZ 문자를 고려하여 az로 변환하고 다른 모든 것은 문제를 요구합니다 (적어도 소스 코드 사용).

  3. 스크립트는 Linux 시스템에서 빌드를 실행하는 데 필요하므로 CVS 또는 Subversion 버전 제어 파일에 대한 변경은 생략해야한다고 생각합니다. 결국, 그것은 단지 스크래치 체크 아웃입니다. 아마도 “수출”이 더 적합 할 것입니다.



답변

"rename"명령을 사용하는 간결한 버전 :

find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

이렇게하면 파일보다 디렉토리 이름이 바뀌거나 존재하지 않는 디렉토리 (예 : "A/A""a/a") 로 파일을 이동하려는 문제가 발생하지 않습니다 .

또는를 사용하지 않고 더 자세한 버전 "rename"입니다.

for SRC in `find my_root_dir -depth`
do
    DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
    if [ "${SRC}" != "${DST}" ]
    then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
    fi
done

추신

후자는 이동 명령 (예 :)으로 더 많은 유연성을 허용 "svn mv"합니다.


답변

더 작은 여전히 ​​나는 아주 좋아 :

rename 'y/A-Z/a-z/' *

OS X의 HFS + 와 같이 대소 문자를 구분하지 않는 파일 시스템 에서는 -f플래그 를 추가하려고합니다 .

rename -f 'y/A-Z/a-z/' *


답변

for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done


답변

효율성에 신경 쓸 필요가 없으면 간단히 다음을 시도하십시오.

zip -r foo.zip foo/*
unzip -LL foo.zip


답변

얘들 아, 너희들 / 여자들은 복잡한 것들을 지나치게 좋아한다.

rename 'y/A-Z/a-z/' *


답변

위의 답변은 대부분 홀수 문자가 포함 된 이름을 다루지 않기 때문에 위험합니다. 이런 종류의 일에 대한 귀하의 안전한 내기 사용하는 것입니다 find-print0대신 ASCII NUL와 파일 이름을 종료합니다 \ n 옵션을.

다음은 혼동하지 않도록 디렉토리 이름이 아닌 파일 만 변경하는 스크립트입니다 find.

find .  -type f -print0 | xargs -0n 1 bash -c \
's=$(dirname "$0")/$(basename "$0");
d=$(dirname "$0")/$(basename "$0"|tr "[A-Z]" "[a-z]"); mv -f "$s" "$d"'

나는 그것을 테스트했고, 공백, 모든 종류의 따옴표 등을 포함하는 파일 이름으로 작동합니다. 루트로 실행하면 파일을 포함하는 트리에서 다른 스크립트 중 하나를 루트로 실행할 경우 중요합니다.

touch \;\ echo\ hacker::0:0:hacker:\$\'\057\'root:\$\'\057\'bin\$\'\057\'bash

… 잘 생각 해봐 …


답변

rename 명령 을 이미 설정했거나 설정 한 경우 (예 : Mac의 brew install 을 통해 ) 다음과 같이 작동합니다.

rename --lower-case --force somedir/*