Похожие вопросы

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

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

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

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

файлы примеров:

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

> ls -b
Abc1def  ÉÈéèáà-rest  everest  éverest

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

> 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, 251 или o251 не удается (совпадений нет).

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

Ищу не спорный персонаж показывает все файлы с grep, как я и ожидал.

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

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

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

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

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

5
задан Community
источник

3 ответов

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

попробуйте внести следующие изменения в командную строку "find":

LANG=C find . -regex '.*[^a-zA-Z./].*'

это устанавливает переменную окружения LANG только в контексте " find" команда. Поскольку кодировка языка " C " поддерживает только ASCII, акцентированные буквы больше не будут рассматриваться как их базовые буквы, и поэтому будут правильно сопоставлены вашим регулярным выражением.

8
отвечен Jander 2010-12-06 01:07:06
источник

ответ Джандера делает работу отлично, для тех, кто заинтересован в получении большего от этого, вот еще один совет.

при LANG=C функция find отображает символы, отличные от 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
5
отвечен asoundmove 2010-12-06 02:09:29
источник
find . | grep -E '.*[^[:print:]].*'

список всех классов символов posix см. В разделе: http://www.regular-expressions.info/posixbrackets.html

0
отвечен Tom Hale 2015-11-15 12:59:41
источник

Другие вопросы bash find grep linux