Символ типа «é» может быть представлен в 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 эс. Ввод символа обычным способом создает другую последовательность байтов, которая не соответствует.
Мое предложение, на мой теперь удален ответ, был 'Ls -l * E *'. Короткая, простая и не работает на OS X. – sarnold
Я должен сказать, что нормализация формы характерна для Mac OS X, но потенциал для несоответствия между «é», введенным с клавиатуры, и «é» в имя файла присуще Unicode. Таким образом, ваше предложение может очень не работать в любой системе с использованием кодировки Unicode. –
Если вы используете bash, вы также можете использовать 'ls -l * $ 'e \ xcc \ x81' *'. –