Назад | Перейти на главную страницу

Как управлять акцентированными файлами в Unix?

На нашей CMS, которая прошла через множество версий и платформ хостинга, мы только что натолкнулись на файл изображения с акцентом, который не работал с его URL-адресом. Итак, я подключился к коробке по ssh и попытался переименовать ее.

Однако я не мог понять, как правильно набрать его имя. Например, я знаю, что если файл называется my file.txt ты бы сделал что-то вроде mv my\ file.txt my_new_file.txt но как переместить файл с именем café.txt?

В конце концов, я использовал подстановочный знак и сделал mv caf*.txt cafe.txt но мне все еще интересно, почему это изображение с акцентом не будет работать в первую очередь, и что было бы правильным способом справиться с ним в unix.

Используя bash:

Просто чтобы посмотреть мои файлы:

$ ls
café.txt

Проверьте шестнадцатеричные байты имени файла (примечание: у меня может быть другое ... у меня, вероятно, в кодировке UTF-8):

$ echo * | hexdump -C
00000000  63 61 66 c3 a9 2e 74 78  74 0a                    |caf...txt.|
0000000a

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

$ ls $'caf\xc3\xa9.txt'
café.txt

В bash $ '...' будет расширять escape-последовательности (так же, как "echo -e"). И \ x, за которым следует двухзначный шестнадцатеричный код, заменит его этим символом.

И я не вижу ничего плохого в:

ls caf*.txt

за которым следует

mv caf*.txt cafe.txt

Но если по какой-то причине это соответствует нескольким файлам, вы можете использовать шестнадцатеричный код:

ls $'caf\xc3\xa9.txt'
mv $'caf\xc3\xa9.txt' café.txt

Файловые системы Unix хранят имена файлов в виде необработанной последовательности байтов. Ядро не знает или не заботится о том, каковы на самом деле имена.

Приложения, обращающиеся к ним, должны использовать правильную кодировку для правильного отображения символов, отличных от ASCII. Обычный способ - через переменные среды LC_ALL / LC_ * или LANG. Я бы рекомендовал использовать локаль UTF-8 для всех приложений, обращающихся к файловой системе, чтобы избежать несовместимости / несогласованности.