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

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

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

Есть ли любой там, который, знал бы, что комбинация опций использовать для нахождения имен файлов, которые содержат нестандартные символы, на том, какой, кажется, unicode FS, в моем случае символы, кажется, расширенный ASCII на 8 битов, а не unicode, файлы прибывают из машины Windows (iso-8859-1), и я регулярно должен выбирать их. Я хотел бы видеть, как находят, и/или 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). Независимо от того, что происходит, вот не то, что я ожидал бы: ни не найдите, ни 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

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

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

Любое понимание очень ценилось бы.

5
задан 23.05.2017, 15:41

2 ответа

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

Попробуйте следующую модификацию к своей командной строке "находки":

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

Это устанавливает переменную среды ЛЕНГА только в контексте команды "находки". Так как "C" кодирование языка поддерживает только ASCII, буквы с диакритическим знаком больше не будет рассматривать как их основные буквы и так подберет правильно Ваш regex.

8
ответ дан 07.12.2019, 16:56

Ответ Jander делает задание отлично для заинтересованных вытаскиванием больше из этого, вот еще одна подсказка.

С LANG=C найдите символы неASCII дисплеев с вопросительными знаками. Для преобразования того назад в их нормальный дисплей с той файловой системой просто передайте вывод по каналу кошке.

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

LANG=C find . -regex '.*[^a-zA-Z./-].*' | cat
./éverest
./ÉÈéèáà-rest
./Abc�def
5
ответ дан 07.12.2019, 16:56

Теги

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