2012-06-14 2 views
3

Я хотел бы перечислить файлы с характером é я выполнить эту команду:ls -l | Список Grep файлов

ls -l | grep é 

и никаких результатов. Содержимое каталога:

-rw-r--r-- 1 user staff  5020 3 may 11:48 begin 
-rw-r--r-- 1 user staff  0 13 jun 08:47 canté 
-rw-r--r-- 1 user staff  0 13 jun 08:47 centré 
-rw-r--r-- 1 user staff  5020 3 may 11:48 end 

конфигурации локали

LANG="es_ES.UTF-8" 
LC_COLLATE="es_ES.UTF-8" 
LC_CTYPE="es_ES.UTF-8" 
LC_MESSAGES="es_ES.UTF-8" 
LC_MONETARY="es_ES.UTF-8" 
LC_NUMERIC="es_ES.UTF-8" 
LC_TIME="es_ES.UTF-8" 
LC_ALL= 

Запуск команды на Mac OS X 10.7.3. Что-то не так?

ответ

5

Символ типа «é» может быть представлен в Unicode двумя разными способами. Это может быть одиночный, предварительно согласованный символ Юникода, ЛАТИНСКИЙ МАЛЕНЬКИЙ ПИСЬМО E С ОСТРОМ U + 00E9, или его можно разложить как два символа, LATIN SMALL LETTER E U + 0065, за которым следует КОМБИНИРОВАНИЕ ОСТРОГО ACCENT U + 0301.

В Mac OS X API-интерфейсы файловой системы всегда нормализуются к специальному варианту формы нормализации D (NFD). В правильном NFD все символы, которые могут быть разложены, являются. В варианте NFD, используемом API-интерфейсами файловой системы Mac OS X, некоторые символы остаются предварительно объединенными для обратной совместимости с устаревшими томами.

В любом случае, я подозреваю, что форма для символа, введенная в терминале, отличается от формы, выводимой ls. Я бы сравнил разницу между ls -l | hexdump -C и echo -n é | hexdump -C. (В обоих случаях вы получите UTF-8 Итак, U + 00e9 будет выглядеть как c3 а9 в то время как U + 0065 U + 0301 будет выглядеть как 65 куб.см 81..)


Update: с немного тестирование, я обнаружил, что это работает:

ls -l | grep $(printf "e\xcc\x81") 

Это, который сродни предложению sarnold, также работает:

ls -l *$(printf "e\xcc\x81")* 

в основном, я использую printf в субоболочке в качестве средства ввода точных байтов, используемых в файле nam эс. Ввод символа обычным способом создает другую последовательность байтов, которая не соответствует.

+0

Мое предложение, на мой теперь удален ответ, был 'Ls -l * E *'. Короткая, простая и не работает на OS X. – sarnold

+0

Я должен сказать, что нормализация формы характерна для Mac OS X, но потенциал для несоответствия между «é», введенным с клавиатуры, и «é» в имя файла присуще Unicode. Таким образом, ваше предложение может очень не работать в любой системе с использованием кодировки Unicode. –

+1

Если вы используете bash, вы также можете использовать 'ls -l * $ 'e \ xcc \ x81' *'. –

1

Я нашел решение, которое работает:

ls -l | iconv -f UTF-8-MAC -t UTF-8 | grep é 
+0

Я рад, что вы нашли решение, которое работает на вас, но оно все еще зависит от того, какая форма нормализации создается при вводе или вставке «é» в терминал. То есть вы изменили нормализованный вывод 'ls', но это практически произвольно, что ваш' grep' на самом деле ищет. –

Смежные вопросы