확장 ASCII 문자가 포함된 파일 이름 검색

확장 ASCII 문자가 포함된 파일 이름 검색

확장 ASCII 문자(0x80-0xFF)가 포함된 디렉터리 트리에서 모든 파일 이름을 찾고 싶습니다. 나는 이것을 할 수 있다고 생각합니다 :

find . -regex '.*[\x80-\xFF]+.*'

그러나 그것은 모든 것과 일치합니다. 또한 표준 a-z, AZ, 0-9, 하이픈 또는 마침표 세트에 없는 문자가 포함된 파일을 찾으려고 했습니다.

find . -regex '.*[^- a-zA-Z0-9]+.*'

분명히 나는 ​​여기서 근본적인 측면을 오해하고 있습니다.

내 트리에 있는 파일의 예:

./file 1/file - 1 - A2.mkv
./file 1/file - 1 - A2.nfo
./tést/tést - 2 - 2.mkv
./français/français - 2 -3.mkv

Ubuntu 20.04에서 find(GNU findutils) 4.7.0을 사용하고 있습니다.

답변1

$ tree
.
|-- file 1
|   |-- file - 1 - A2.mkv
|   `-- file - 1 - A2.nfo
|-- français
|   `-- français - 2 -3.mkv
`-- tést
    `-- tést - 2 - 2.mkv

3 directories, 4 files
$ LC_ALL=C find . -name '*[![:print:]]*'
./tést
./tést/tést - 2 - 2.mkv
./français
./français/français - 2 -3.mkv

이는 명령의 로케일을 find표준 POSIX 로케일로 설정합니다. 문자 print클래스에는 문자 클래스 alpha, 에 속하는 digit문자가 포함되며 punct공백 문자도 포함됩니다. 이는 테스트가 -name '*[![:print:]]*'다음과 같이 진행됨을 의미합니다.진짜다음 문자를 포함하는 파일 이름의 경우아니요print교실 에서 .

다양한 공백 문자(탭 등)가 포함된 이름을 찾고 싶지 않은 경우 테스트로 사용하십시오 [![:graph:][:space:]]( print및 사이의 유일한 차이점은 공백 문자를 포함하지 않는다는 graph점입니다 ).graph

답변2

Kusalananda의 답변에는 ASCII 제어 문자가 포함된 파일 이름도 포함되어 있습니다. 이는 바람직할 수 있지만 그렇지 않은 경우 질문에 더 정확하게 대답하는 Kusalananda 기반 솔루션은 다음과 같습니다.

LC_ALL=C find . -name $'*[\x80-\xff]*'

사용 예:

$ touch foo bár $'baz\x01'                         
$ ls
 bár  'baz'$'\001'   foo
$ LC_ALL=C find . -name $'*[\x80-\xff]*'           
./b??r
$ LC_ALL=C find . -name $'*[\x80-\xff]*' | od -tx1z
0000000 2e 2f 62 c3 a1 72 0a                             >./b..r.<
0000007

당신이 하려는 것과의 차이점은 여기서 쉘이 16진수 이스케이프 시퀀스를 그대로 두는 대신 해석한다는 것입니다 find. 또한 그렇지 않으면 이 단어가 정규식 또는 전역 변수 섹션에 LC_ALL=C때문에 이것이 필요할 수도 있습니다 . 다른 캐릭터의..*

관련 정보