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
-
rename
rename -n
rename -n --
rename
최신 버전 perl
에서는 \w
(단어문자)는 영숫자(라틴어뿐만 아니라 모든 알파벳 텍스트) 또는 밑줄 문자와 기타 문자입니다.커넥터 구두점 문자유니코드 태그(예:날카로운 악센트와 결합다음 문자는 e
) 의 분해된 형태로 표현됩니다 é
.
좀 더 제한적으로 사용하려면 라틴 알파벳(키릴 문자, 그리스어... 대신), 결합 발음 구별 부호(일반적으로 라틴 알파벳 발음 구별 부호와 함께 사용되는 문자에 국한되지는 않음) 및 인도-아랍어 문자만 \w
사용할 수 있습니다. \p{latin}\p{mark}0-9_
10진수(다른 유형의 숫자 제외) 및 밑줄(다른 연결 구두점 문자 제외)
사용되지 않는 경우 utf8::decode
문자 perl
는 iso8859-1 단일 바이트 문자 세트로 인코딩된 것으로 간주됩니다(예: 0xc3 0xa9
UTF-8 인코딩의 미리 어셈블된 형식 é
은 Ã
©
).
또는 다음을 사용할 수 있습니다 zsh
(로케일 인코딩에 따라 문자를 디코딩함( 출력 참조 locale charmap
)).
autoload zmv # best in ~/.zshrc
zmv -n '(**/)(*)(#qD)' '$1${2//[^][:alnum:]_.@+,#!?:&%~()[\/ -]/?}'
로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스의 각 바이트도 a로 변환됩니다 ?
( rename
위의 내용은 오류로 종료됩니다 cannot decode
).
이는 [[:alnum:]]
귀하의 로케일 alnum
범주를 사용하므로 다른 유니코드 커넥터 구두점이나 표시 문자를 포함할 가능성이 없습니다.
perl
Android zsh
(일반적으로 다른 도구에서는 아님)에서 유사한 범위는 [a-zÀ-ÿ]
문자 코드 포인트를 기반으로 합니다. 예를 들어, 이 범위는 해당 코드 포인트 범위 내의 문자와 일치합니다(알파벳이 아닌 문자를 포함하며 라틴 알파벳이나 프랑스어에서 사용되는 모든 문자는 포함되지 않음 azÀÿ
). 에서는 Perl 코드에서 UTF-8 인코딩을 사용할 수 있도록 UTF-8 인코딩도 추가해야 합니다.\u0061\u007A\u00C0\u00FF
abcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
œ
perl
use utf8
À
ÿ