파일 이름을 대문자에서 소문자로 바꾸기

파일 이름을 대문자에서 소문자로 바꾸기

좀 더 자세히 설명할 필요가 있어요. 이 명령은 실제로 BBS FTN 투척자를 위한 것입니다. 이러한 명령이 있는 구성 파일에서는 특정 선언만 허용됩니다. 여기 몇 가지 예가 있어요.

exec "/home/imp/imp/poll.sh" *.su? *.mo? *.tu? *.we? *th? *.fr? *.sa? *.pkt
flag toss!.now [0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z].???
exec "/home/imp/imp/poll.sh /home/imp/hpt/secure" /home/imp/hpt/secure/*.[STFWMstfWM][ouaherOUAHER][0-9A-ZA-a] *.[pP][kK][tT]

이것이 바로 내가 해당 구문([0-9a-z](예:))을 사용하고 싶은 이유입니다. 문제는 메일 프로그램이 소문자 파일 이름을 찾고 있지만 대문자 파일 이름만 존재한다는 것입니다.

다음 구문을 사용하여 파일을 대문자에서 소문자로 변환하려고 합니다.

mv /home/imp/hpt/outbound/[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z].[STFWMfWM][OUAHER][0-9] /home/imp/hpt/outbound/[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z].[stfwm][ouaher][0-9a-za-a]

내 구문이 잘못된 것 같아요.

다음은 이름을 바꾸려는 파일 이름의 예입니다.

0000FE70.FR0

모든 도움에 크게 감사드립니다. 감사해요.

답변1

한 유형의 문자를 다른 유형의 문자로 변경하려면 를 사용하십시오 tr.

for f in *; do
    test -f "$f" && echo mv "$f" "$( tr '[:upper:]' '[:lower:]' <<<"$f" )"
done

이 스크립트는 현재 디렉터리의 모든 파일 이름을 모두 소문자로 바꿉니다. 디렉토리를 건너뜁니다. echo요구 사항을 충족한다고 확신하면 제거하세요. 표준 ASCII 파일 이름만 있는 경우(참고: 대신) [:upper:]및를 각각 [:lower:]으로 바꿀 수 있습니다 A-Z.a-zA-Z[A-Z]

또는 Bash의 내장 변수 대체를 대문자에서 소문자로 사용하세요.

for f in *; do
    test -f "$f" && echo mv "$f" "${f,,}"
done

답변2

이 답변Stack Overflow의 Alex B는 디렉터리 아래의 파일 및 하위 폴더 이름을 바꾸는 데 도움을 줍니다.

여기에는 findLinux rename명령 사용이 포함됩니다. 위 링크에 제공된 명령이 디렉터리 이름도 수정한다는 점을 추가하고 싶습니다. 파일 이름만 변경하려면 -depth다음 옵션을 변경해야 합니다 -type f.

이 명령에 대한 또 다른 정규식은 rename다음과 같습니다. 이해하기 더 쉽다고 생각합니다.

 find my_root_dir -type f -execdir rename 'y/A-Z/a-z/' {} \;

rename명령 정규식과 중괄호 사이에는 필수 공백이 있고, 이들과 명령 종료 문자 사이에도 공백이 있습니다.\;

my_root_dir또한 명령을 실행하는 디렉터리(directory )의 모든 파일 이름뿐만 아니라 해당 디렉터리에 포함된 모든 하위 폴더 아래의 모든 파일 이름도 변경된다는 점을 명심하세요 . -maxdepth 0명령의 옵션을 사용하여 find시작 지점 자체에만 테스트와 작업을 적용하도록 강제할 수 있습니다.

답변3

그리고 zsh:

autoload zmv # best in ~/.zshrc
zmv '[[:alnum:]](#c8).[STFWMfWM][OUAHER][0-9]' '${(L)f}'

이를 위해서는 잠재적인 충돌을 확인해야 합니다.

답변4

rename-lower현재 디렉토리에 대한 간단한 스크립트입니다. rename명령이 작동하지 않으면 mv에서 변경할 수 있습니다.

#/bin/bash
# script to replace all upper case to lower case
for i in *
do
        d=$(echo ${i} |tr [:upper:] [:lower:]);
        if [ ${d} != ${i} ]
        then
                echo "renaming:" ${i} ${d}
                rename ${i} ${d} ${i}
#               mv ${i} ${d}
        fi
done

$ ls
tmp.EwcM2s6kfU  tmp.kcUX6rtjiu  tmp.kzpqLvWcnQ  tmp.N1H8bLt1at

$ rename-lower
renaming: tmp.EwcM2s6kfU  tmp.ewcm2s6kfu
renaming: tmp.kcUX6rtjiu  tmp.kcux6rtjiu
renaming: tmp.kzpqLvWcnQ  tmp.kzpqlvwcnq
renaming: tmp.N1H8bLt1at  tmp.n1h8blt1at

관련 정보