프랑스어 문자로 파일 및 디렉터리 이름 바꾸기

프랑스어 문자로 파일 및 디렉터리 이름 바꾸기

Ubuntu에서 다음 명령 rename( 사용 )을 사용하여 sudo apt-get rename정규식에서 특정 문자가 있는 모든 파일의 이름을 바꾸고 있습니다.

find . -execdir rename 's/[^A-Za-z0-9_.@+,#!?:&%~\(\)\[\]\/ \-]/?/g' * {} \;

이것은 잘 작동하며 다른 모든 문자는 ?. 이제 이와 같은 프랑스어 문자를 포함하고 싶습니다 àèìòù. 그래서 À-ÿ정규식에 다음을 추가했습니다 .

find . -execdir rename 's/[^A-Za-zÀ-ÿ0-9_.@+,#!?:&%~\(\)\[\]\/ \-]/?/g' * {} \;

하지만 파일 이름이 바뀌지 않고 À-ÿ더 이상 삭제할 수 없기 때문에 이 명령을 실행한 후에 파일이 손상된 것 같습니다.

이름 바꾸기 정규식에 이를 포함하는 올바른 방법은 무엇입니까?

답변1

이러한 파일 이름이 UTF-8로 인코딩되었다고 가정하면 다음을 사용하십시오.

find . -depth -execdir rename -n '
  utf8::decode$_ or die "cannot decode $_\n";
  s{[^\w.\@+,#!?:&%~()\[\]/ -]}{?}gs;
  utf8::encode$_;
  ' {} +

(행복하면 제거됨 -n).

일부 BSD 구현에서는 파일 find이름 앞에 접두어를 붙이지 않으므로 파일 이름이 로 시작하면 명령이 실패할 수 있습니다 . 변형을 사용하면 (다른 모든 Perl 변형에서는 작동하지 않음 ) 로 변경하여 이 문제를 해결할 수 있습니다 ../-execdir-renamerename -nrename -n --rename

최신 버전 perl에서는 \w(단어문자)는 영숫자(라틴어뿐만 아니라 모든 알파벳 텍스트) 또는 밑줄 문자와 기타 문자입니다.커넥터 구두점 문자유니코드 태그(예:날카로운 악센트와 결합다음 문자는 e) 의 분해된 형태로 표현됩니다 é.

좀 더 제한적으로 사용하려면 라틴 알파벳(키릴 문자, 그리스어... 대신), 결합 발음 구별 부호(일반적으로 라틴 알파벳 발음 구별 부호와 함께 사용되는 문자에 국한되지는 않음) 및 인도-아랍어 문자만 \w사용할 수 있습니다. \p{latin}\p{mark}0-9_10진수(다른 유형의 숫자 ​​제외) 및 밑줄(다른 연결 구두점 문자 제외)

사용되지 않는 경우 utf8::decode문자 perl는 iso8859-1 단일 바이트 문자 세트로 인코딩된 것으로 간주됩니다(예: 0xc3 0xa9UTF-8 인코딩의 미리 어셈블된 형식 éà ©).

또는 다음을 사용할 수 있습니다 zsh(로케일 인코딩에 따라 문자를 디코딩함( 출력 참조 locale charmap)).

autoload zmv # best in ~/.zshrc
zmv -n '(**/)(*)(#qD)' '$1${2//[^][:alnum:]_.@+,#!?:&%~()[\/ -]/?}'

로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스의 각 바이트도 a로 변환됩니다 ?( rename위의 내용은 오류로 종료됩니다 cannot decode).

이는 [[:alnum:]]귀하의 로케일 alnum범주를 사용하므로 다른 유니코드 커넥터 구두점이나 표시 문자를 포함할 가능성이 없습니다.

perlAndroid zsh(일반적으로 다른 도구에서는 아님)에서 유사한 범위는 [a-zÀ-ÿ]문자 코드 포인트를 기반으로 합니다. 예를 들어, 이 범위는 해당 코드 포인트 범위 내의 문자와 일치합니다(알파벳이 아닌 문자를 포함하며 라틴 알파벳이나 프랑스어에서 사용되는 모든 문자는 포함되지 않음 azÀÿ). 에서는 Perl 코드에서 UTF-8 인코딩을 사용할 수 있도록 UTF-8 인코딩도 추가해야 합니다.\u0061\u007A\u00C0\u00FFabcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿœperluse utf8Àÿ

관련 정보