Giả sử rằng "nước ngoài" có nghĩa là "không phải là ký tự ASCII", thì bạn có thể sử dụng find
với một mẫu để tìm tất cả các tệp không có ký tự ASCII có thể in trong tên của chúng:
LC_ALL=C find . -name '*[! -~]*'
(Không gian là ký tự có thể in đầu tiên được liệt kê trên http://www.asciitable.com/ , ~
là ký tự cuối cùng.)
Gợi ý cho LC_ALL=C
là bắt buộc (thực tế LC_CTYPE=C
và LC_COLLATE=C
), nếu không, phạm vi ký tự được giải thích không chính xác. Xem thêm trang hướng dẫn glob(7)
. Vì các LC_ALL=C
nguyên nhân find
để giải thích các chuỗi là ASCII, nó sẽ in các ký tự nhiều byte (chẳng hạn như π
) dưới dạng các dấu hỏi. Để khắc phục điều này, chuyển sang một số chương trình (ví dụ cat
) hoặc chuyển hướng đến tệp.
Thay vì chỉ định phạm vi ký tự, [:print:]
cũng có thể được sử dụng để chọn "ký tự có thể in". Hãy chắc chắn đặt ngôn ngữ C hoặc bạn có hành vi khá (dường như) tùy ý.
Thí dụ:
$ 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
./π