Использование find или grep для поиска имен файлов с акцентированными символами из другой системы кодирования (от Windows до Linux) - PullRequest
3 голосов
/ 05 декабря 2010

Я поздно попытался пометить вопрос, похожий на мой ( Найти имена файлов, отличные от UTF8, в файловой системе Linux ), чтобы получить дополнительные ответы, но пока безуспешно, так что здесь снова ...

У меня та же проблема, что и у OP по ссылке выше, и convmv - отличный инструмент для исправления собственной файловой системы.Поэтому мой вопрос академический, но я нахожу неудовлетворительным (на самом деле я не могу поверить), что 'find' не может найти нестандартные символы ascii.

Есть ли кто-нибудь, кто знал бы, какую комбинациюопций, которые можно использовать для поиска имен файлов, содержащих нестандартные символы на том, что похоже на Unicode FS, в моем случае символы кажутся расширенными ascii, а не unicode, на 8 битов, файлы приходят с компьютера Windows (iso-8859-1)и мне регулярно нужно их забирать.Мне бы хотелось посмотреть, как find и / или grep могут делать то же самое, что и convmv.

Образцы файлов:

> ls
Abc�def ÉÈéèáà-rest everest éverest

> ls -b
Abc\251def  ÉÈéèáà-rest  everest  éverest

Первый файл поступает из Windows (или имитируется с помощью touch $(printf "Abc\xA9def")).

> find . -regex '.*[^a-zA-Z./].*'
./ÉÈéèáà-rest

> ls | egrep '[^a-zA-Z]'
ÉÈéèáà-rest

Отсутствует почти все из них (дефис, сохранивший этот файл, можно увидеть с помощью цветного grep).Все, что здесь происходит, - это не то, что я ожидал: ни find, ни grep не в состоянии воспринимать акцентированное письмо как выходящее за пределы диапазона, предусмотренного [^ a-zA-Z ./].

> find . -regex '.*é.*'
./éverest
./ÉÈéèáà-rest

> ls | egrep 'é'
ÉÈéèáà-rest
éverest

> ls | egrep '[é]'
ÉÈéèáà-rest
éverest

> find . -regex '.*[é].*'
./éverest
./ÉÈéèáà-rest

Странно обаспособны подобрать стандартный акцент при наличии (в том числе в ассортименте).Любая попытка найти или grep с \ xA9, \ 0251 или \ o251 не удалась (без совпадения).

> ls | fgrep e
Abc�def
ÉÈéèáà-rest
everest
éverest

При поиске не противоречивого символа все файлы отображаются с grep, как я и ожидал.

> find . -regex '.*e.*'
./éverest
./ÉÈéèáà-rest
./everest

> find . -name '*e*'
./éverest
./ÉÈéèáà-rest
./everest

находка, однако, очень дискриминационная: даже при поиске нормального символа мне кажется, что он исключает имена файлов, которые содержат символы вне диапазона допустимых символов для схемы кодирования имен файловой системы.

Насколько я понимаю, если файл находится в файловой системе, тогда find должен его найти, верно?Но, может быть, есть такая особенность, о которой я не знаю?

Любые идеи будут очень признательны.

1 Ответ

0 голосов
/ 06 декабря 2010

Джандер ответил на тот же вопрос, который я разместил в Super User

Ответ Джандера отлично справляется со своей задачей, для тех, кто хочет получить больше пользы, вот еще один совет.1005 *

Если LANG = C, найдите символы, отличные от ascii, с вопросительными знаками.Чтобы преобразовать это обратно в их обычное отображение с этой файловой системой, просто передайте вывод в cat.

LANG=C find . -regex '.*[^a-zA-Z./-].*'
./??verest
./????????????-rest
./Abc?def

LANG=C find . -regex '.*[^a-zA-Z./-].*' | cat
./éverest
./ÉÈéèáà-rest
./Abc�def
...