130자 이상의 영어 문자 또는 43자 이상의 아시아 문자를 포함하는 디렉토리에서 모든 파일을 찾습니다.

130자 이상의 영어 문자 또는 43자 이상의 아시아 문자를 포함하는 디렉토리에서 모든 파일을 찾습니다.

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 의 경우 Mglob 한정자( ) 를 추가하면 디렉토리에 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까지입니다.

관련 정보