![확장 ASCII 문자가 포함된 파일 이름 검색](https://linux55.com/image/175492/%ED%99%95%EC%9E%A5%20ASCII%20%EB%AC%B8%EC%9E%90%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%EA%B2%80%EC%83%89.png)
확장 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
때문에 이것이 필요할 수도 있습니다 . 다른 캐릭터의..
*