NAS에서 파일을 전송하려고 하는데 "암호화된 공유 폴더의 파일 또는 폴더 이름은 영어 문자 143자 또는 아시아어(CJK) 문자 47자를 초과할 수 없습니다."라는 오류가 나타납니다. 일치하는 모든 파일을 찾는 명령 셸이 있습니까? 이 조건부 문서?
답변1
find path | grep -P '\/[^\/]{130,}[^\/]$'
stackoverflow.com의 이 소스를 기반으로 합니다. Synology 암호화 공유에 비해 너무 긴 파일 찾기
폴더가 아닌 파일만 캡처하기 위해 끝에 $를 추가했습니다.
어쩌면 다양한 유니코드를 사용하는 CJK 문자를 찾을 수도 있습니다. 나는 grep이 이것을 할 수 없을 것이라고 생각합니다. 아마도우그레프.
답변2
UTF-8로 인코딩할 때 파일 이름이 143자를 초과할 수 없다고 말하는 것 같습니다.바이트많은 아시아 문자(의미가 무엇이든)가 3바이트의 UTF-8로 인코딩되는 반면(48 x 3은 144임을 알 수 있음) 대부분의 영어 문자는 1바이트로 인코딩된다고 가정합니다.
그래서 그것을 찾으려면:
존재하다 zsh
:
set +o multibyte -o extendedglob
print -rC1 -- **/?(#c144,)(ND)
한도를 초과한 분들을 위해
set +o multibyte -o extendedglob
print -rC1 -- **/?(#c1,143)(ND)
한도 미만인 경우.
해당 유형을 더 쉽게 볼 수 있도록목차M
, ark 의 경우 M
glob 한정자( ) 를 추가하면 디렉토리에 print -rC1 -- **/?(#c144,)(NDM)
a가 추가됩니다 ./
또는 다음을 사용하여 find
:
LC_ALL=C find . -name '????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????*'
한도를 초과하는 사람들을 위해.
위의 시간은 144 ?
초입니다. 다음을 사용하여 패턴을 작성할 수도 있습니다.
pattern=$(printf %145s '*' | tr ' ' '?')
LC_ALL=C find . ! -name "$pattern"
또는 zsh
:
pattern=${(l[145][?]):-*}
제한(143바이트 이하로 구성) 미만의 파일 이름을 얻으려면 다음 -name
으로 바꾸십시오 .! -name
GNU 구현을 사용하면 find
다음도 수행할 수 있습니다.
LC_ALL=C find . -regextype posix-extended -regex '.*/[^/]{144,}'
1 UTF-8 인코딩은 1~4바이트의 문자를 인코딩합니다. 원래 알고리즘은 최대 6바이트의 코드 포인트를 U+7FFFFFF까지 인코딩하도록 설계되었지만 유니코드 코드 포인트는 나중에 U+ 10FFFF로 제한되었습니다. -ASCII 세트(코드 포인트 U+0000 ~ U+007F)는 1바이트로 인코딩됩니다. 3바이트 인코딩은 U+0800부터 U+FFFF까지입니다.