Предполагая, что «иностранный» означает «не символ 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_COLLATE в C без установкиLC_CTYPE
и чтобы убедиться, что он все еще работает, даже когда переменная LC_ALL находится в среде.SPC
это версия для печати , то , что оTAB
иLF
которые также обычно находятся в текстовых файлах?LC_COLLATE
иLC_CTYPE
см. Такжеfind(1)
справочную страницу.Если вы переводите каждое имя файла с помощью
tr -d '[\200-\377]'
и сравниваете его с исходным именем, то любые имена файлов, содержащие специальные символы, не будут одинаковыми.(Выше, предполагая, что вы имеете в виду не ASCII с иностранным)
источник
[
и]
в большинствеtr
реализаций.[
и]
в моей системе.[
и]
s). Спасибо.Вы можете использовать
tr
для удаления любого внешнего символа из имени файла и сравнить результат с исходным именем файла, чтобы увидеть, не содержит ли он иностранных символов.источник
find
вывод, используйте вывод / ввод с NUL-завершением, как показано в этом ответе .Принятый ответ полезен, но если ваши имена файлов уже в кодировке, указанной в
LANG
/LC_CTYPE
, лучше просто сделать:На классы символов влияет
LC_CTYPE
, но приведенная выше команда не использует классы символов, а только диапазоны, поэтомуLC_CTYPE
просто предотвращает замену необычных символов на вопросительные знаки.источник