Zakładając, że „obcy” oznacza „nie znak ASCII”, możesz użyć find
wzorca, aby znaleźć wszystkie pliki, które nie mają drukowalnych znaków ASCII w swoich nazwach:
LC_ALL=C find . -name '*[! -~]*'
(Spacja jest pierwszą postacią do wydrukowania wymienioną na stronie http://www.asciitable.com/ , ~
jest ostatnią.)
Podpowiedź do LC_ALL=C
jest wymagana (a właściwie LC_CTYPE=C
i LC_COLLATE=C
), w przeciwnym razie zakres znaków zostanie nieprawidłowo zinterpretowany. Zobacz także stronę podręcznika glob(7)
. Ponieważ LC_ALL=C
powoduje find
interpretację ciągów znaków jako ASCII, wypisze znaki wielobajtowe (np. π
) Jako znaki zapytania. Aby to naprawić, podłącz do jakiegoś programu (np. cat
) Lub przekieruj do pliku.
Zamiast określać zakresy znaków, [:print:]
można również użyć do wybrania „znaków do wydruku”. Pamiętaj, aby ustawić ustawienia regionalne C, w przeciwnym razie otrzymasz dość (pozornie) arbitralne zachowanie.
Przykład:
$ 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
zamiast,LC_COLLATE=C
ponieważ nie ma większego sensu ustawianie LC_COLLATE na C bez ustawianiaLC_CTYPE
i upewnienie się, że nadal działa, nawet gdy zmienna LC_ALL znajduje się w środowisku.SPC
można drukować , to coTAB
iLF
jakie zwykle można znaleźć w plikach tekstowych?LC_COLLATE
iLC_CTYPE
patrz także stronafind(1)
podręcznika.Jeśli przetłumaczysz każdą nazwę pliku za pomocą
tr -d '[\200-\377]'
i porównasz ją z oryginalną nazwą, wówczas nazwy plików zawierające znaki specjalne nie będą takie same.(Powyższe przy założeniu, że masz na myśli non-ASCII z zagranicznym)
źródło
[
i]
w większościtr
implementacji.[
i]
w moim systemie.[
and]
). dzięki.Możesz użyć,
tr
aby usunąć dowolny obcy znak z nazwy pliku i porównać wynik z oryginalną nazwą pliku, aby sprawdzić, czy zawiera on obce znaki.źródło
find
dane wyjściowe, użyj wyjścia / danych zakończonych przez NUL, jak pokazano w tej odpowiedzi .Przyjęta odpowiedź jest pomocna, ale jeśli twoje nazwy plików są już w kodowaniu określonym w
LANG
/LC_CTYPE
, lepiej po prostu zrobić:Na klasy znaków ma wpływ
LC_CTYPE
, ale powyższe polecenie nie używa klas znaków, tylko zakresy, więcLC_CTYPE
po prostu zapobiega zastępowaniu niezwykłych znaków znakami zapytania.źródło