LINUX.ORG.RU
решено ФорумAdmin

проблемы с кодировкой в названии файлов

 , ,


0

1

Перенес файлы с одного сервера на другой. Некоторые символы в названиях файлов стали отображаться как квадраты, например «№». Причем с этими файлами нельзя ничего сделать через файлменеджер, ни удалить, ни переименовать, т.к. пишет что файл не сущетвует (а его видно).


Вопрос в том, что сделать, чтобы названии таких файлов корректно отображались все символы?

ни удалить, ни переименовать

Можно сделать по номеру inode через find. Вменяемого решения проблемы в целом не могу сказать, не ясно что там приключилось в процессе переноса - как переносили файлы, какая ОС\локали там и там?

micronekodesu ★★★
()

Включить однобайтную локаль. Например, KOI8-R. Тогда отдельные байты распарсятся без ошибок. Хоть и смысла в итоговых именах может быть никакого. Но, зато с файлами можно будет легко проводить операции - переименовывать, удалять,... и т.д.

saahriktu ★★★★★
()
Ответ на: комментарий от micronekodesu

Переносил rsync, с ubuntu 12.04 (cp1251) на ubuntu 14.04(utf8). С локального компьютера, где стоит ubuntu 14.04, подключаюсь через файловый менеджер к старому серверу и тоже вижу квадраты. Т.е. проблема возникла не во время переноса

la_boum
() автор топика
Ответ на: комментарий от la_boum

Если имена файлов уже в cp1251, то выставить лучше cp1251. Для этого надо выполнить

export LANG="ru_RU.CP1251"
Ещё может потребоваться настроить эмулятор терминала на работу с cp1251. В иксовых эмуляторах терминала кодировка может выставляться на лету. Зависит от реализации. В случае ядерной консоли придётся настраивать отдельно.

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

#!/bin/bash
NEWFNAME=`echo "$1" | iconv -c -f cp1251 -t utf-8`
if [ "$1" != "$NEWFNAME" ]; then
mv -i "$1" "$NEWFNAME"
fi
Допустим, имя файла этого скрипта ~/cp1251toutf8. Тогда можно просто перейти в директорию с файлами и выполнить
find . -type f -exec ~/cp1251toutf8 "{}" \;
Да, с вложенными директориями такое не сработает. Но, без вложенных директорий и такая реализация должна сработать.

После переименования можно будет вернуть обратно UTF-8.

saahriktu ★★★★★
()
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

не хотелось бы выставлять cp1251. в названии файлов, думаю кириллицы нет, только с символами типа «№» проблемы почему то(

la_boum
() автор топика
Ответ на: комментарий от la_boum

rsync не меняет кодировку имен файлов, как записано, так и сохраняет. Вот и остались в однобайтной CP1251. Для перекодирования можно использовать утилиту convmv:

convmv -f cp1251 -t utf-8 -r .
расскажет, что и как собирается переименовать в текущей директории, а
convmv -f cp1251 -t utf-8 -r --notest .
собственно переименует.

TeopeTuK ★★★★★
()
Ответ на: комментарий от la_boum

почему то

Потому, что этих символов нет в ASCII. Соответственно, для однобайтной cp1251 их коды больше чем 127. Что для парсера юникода включает _последовательности_ из ряда байтов. При этом, поскольку, эти байты никто не подбирал, чтобы они создавали корректные для UTF-8 последовательности, местами получаются невалидные для UTF-8 последовательности (да, в UTF-8 есть такое). И парсеры юникода ломаются.

Для парсеров же однобайтных кодировок любые последовательности байт валидны, поскольку каждый отдельный байт воспринимается как отдельный указатель на один из 256-ти символов.

saahriktu ★★★★★
()
Ответ на: комментарий от TeopeTuK

огромное спасибо!!!

юзал без ключа "--notest", сам затупил. Очень много нервных клеток вы мне съэкономили)

la_boum
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.