이 find 명령이 ASCII가 아닌 문자만 포함된 파일 이름을 반환하지 않는 이유는 무엇입니까?

이 find 명령이 ASCII가 아닌 문자만 포함된 파일 이름을 반환하지 않는 이유는 무엇입니까?

find이 명령이 작동하지 않는 근본 원인을 확인하려고 합니다. 아래에 호출된 파일과 일치하지 않아야 합니다 this_should_not_match.

$ > find . -type f -name "*[^ -~]*"
./__º╚t
./this_should_not_match
./__╞_u
./__¡VW
./__▀√Z
./__εè_
./__∙Σ_
./__Σ_9
./__Σhm
./__φY_

내 쉘은 Bash 3.2입니다.

답변1

범위는 C 로케일에서만 안정적이고 이식 가능하게 작동합니다. 다른 로케일에서는 약간의 변형이 있지만 일반적으로 [x-y]문자가 일부 정렬 순서(실제로는 문자 순서와 일치할 수도 있는 조합 요소)에 따라 앞뒤로 정렬됩니다. 이는 일반적으로 모호하고 항상 사용된 것과 동일하지 않습니다.xysort

C 로케일(참조:"LC_ALL=C"는 무엇을 합니까?), 문자는 바이트이며 범위는 문자의 코드 포인트(바이트 값 기준)를 기준으로 합니다.

LC_ALL=C find . -type f -name "*[^ -~]*"

ASCII 기반 시스템(대부분; POSIX는 C 로캘이 ASCII 문자 집합을 사용할 것을 보장하지 않지만 실제로는 특별한 EBCDIC 기반 IBM 메인프레임 운영 체제를 사용하지 않는 한 ) , ASCII)를 사용하면 이름이 32에서 126 사이의 바이트가 아닌 바이트를 포함하는 일반 파일을 나열합니다.

또한 멀티 바이트 문자 로케일(현재 표준인 UTF-8 로케일 등)에서는 *일부 시스템에서 유효한 바이트 시퀀스를 형성하지 않는 문자와 일치하지 않기 때문에 모든 파일 이름을 일치시키는 것이 불가능할 수도 있습니다.

관련 정보