답변:
"외국"이 "ASCII 문자가 아님"을 의미한다고 가정하면 find
패턴과 함께 사용 하여 이름에 인쇄 가능한 ASCII 문자가없는 모든 파일을 찾을 수 있습니다.
LC_ALL=C find . -name '*[! -~]*'
(공간은에 나열된 첫 번째 인쇄 가능한 문자 http://www.asciitable.com/은 , ~
마지막입니다.)
에 대한 힌트 LC_ALL=C
가 필요합니다 (실제로 LC_CTYPE=C
및 LC_COLLATE=C
). 그렇지 않으면 문자 범위가 잘못 해석됩니다. 매뉴얼 페이지도 참조하십시오 glob(7)
. 때문에 LC_ALL=C
원인은 find
ASCII와 같은 문자열을 해석하기 위해서는 (예 : 멀티 바이트 문자를 인쇄 할 π
물음표로). 이 문제를 해결하려면 일부 프로그램 (예 :)으로 파이프 cat
하거나 파일로 리디렉션하십시오.
문자 범위를 지정하는 대신 [:print:]
"인쇄 가능한 문자"를 선택하는 데 사용할 수도 있습니다. C 로케일을 설정해야합니다.
예:
$ touch $(printf '\u03c0') "$(printf 'x\ty')"
$ ls -F
dir/ foo foo.c xrestop-0.4/ xrestop-0.4.tar.gz π
$ find -name '*[! -~]*' # this is broken (LC_COLLATE=en_US.UTF-8)
./x?y
./dir
./π
... (a lot more)
./foo.c
$ LC_ALL=C find . -name '*[! -~]*'
./x?y
./??
$ LC_ALL=C find . -name '*[! -~]*' | cat
./x y
./π
$ LC_ALL=C find . -name '*[![:print:]]*' | cat
./x y
./π
LC_ALL=C
대신에 사용하고 싶습니다 . LC_COLLATE=C
LC_CTYPE
SPC
입니다 인쇄 , 다음 대해 TAB
와 LF
도 일반적으로 텍스트 파일에서 발견되는?
LC_COLLATE
와 LC_CTYPE
, 또한 참조 find(1)
맨 페이지를.
각 파일 이름을 사용하여 번역 tr -d '[\200-\377]'
하고 원래 이름과 비교하면 특수 문자가있는 파일 이름은 동일하지 않습니다.
(외국인과 비 ASCII를 의미한다고 가정 한 위의 내용)
[
하고 ]
대부분 tr
의 구현.
[
및 ]
내 시스템에.
[
및 ]
s 이외에) 모든 (6) 파일 이름을 찾았습니다 . 감사.
당신이 사용할 수있는 tr
파일 이름에서 외국 문자를 삭제하고 외국 문자를 포함하고 있는지 확인하기 위해 원본 파일 이름으로 결과를 비교합니다.
find . -type f > filenames
while read filename; do
stripped="$(printf '%s\n' "$filename" | tr -d -C '[[:alnum:]][[:space:]][[:punct:]]')"
test "$filename" = "$stripped" || printf '%s\n' "$filename";
done < filenames