- Почему не работает кириллица в ubuntu в названиях файлов?
- unixforum.org
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
- Re: Решено: Искорёжены русские имена файлов
Почему не работает кириллица в ubuntu в названиях файлов?
Сервер Ubuntu не дает создать файл, в названии которого присутствует кириллица. Запуская код локально на винде все нормально выполняется. Данные передаю в UTF-8 на сервер, в принтах все нормально отображается до момента создания файла. Это фича Ubuntu? только начал с ней работать.
Простой 2 комментария
скорее твой код кривой, т.к. в Ubunte нет проблем с русскими (и вообще национальными) именами файлов.
AlexVWill, вобще то есть проблемы, у всех линуксов, не только у убунты. там например нельзя создать файл в имени которого больше чем 127 русских букв, в utf8 это получается больше 256 байт и ни одна файловая система в линуксе столько не может (ну кроме ntfs и exFat)
За мультиязыковую поддержку файловых систем отвечает ядро linux (опция
CONFIG_NLS_DEFAULT=utf8 в /boot/config* ), когда то очень давно для решения проблем с кирилицей сюда прописывали koi8 и т.п. (еще есть CONFIG_EXFAT_DEFAULT_IOCHARSET=utf8, полагаю это персональная опция для exfat) и сейчас это дефолтные значения в ubuntu (и нормально их не изменить, т.е. нужно будет вручную пересобирать ядро).
Для очистки совести выполни в консоли locale -a и проверь, есть ли в выводе ru_RU.utf8, но это отвечает больше за вывод в консоли, терминале и в приложениях в принципе. Поэтому в зависимости от того как именно ты работаешь с файлами, наверное это критично.
Чтобы добавить русскую локаль, зайди в GUI настройки OS и добавь ее, будет автоматически установлено необходимое ПО и предложен ребут.
p.s. нужно больше информации, как и куда пишешь файл.
например что будет если файл создать с помощью консольной утилиты
touch имя_файла
Linux sergueik71 5.4.0-42-generic #46~18.04.1-Ubuntu SMP Fri Jul 10 07:21:24 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
-rw-rw-r-- 1 sergueik sergueik 0 Dec 10 23:51 фывапролдже
unixforum.org
После нехорошего одного сбоя мне пришлось спасать данные с жесткого диска (раздел ext3) на съемный (форматирован в fat32). Видимо мой live-cd как-то некорреутно поддерживал русские имена файлов, или я выставила неправильные параметры монтирования, но когда я подмонтировала этот диск в свежеустановленном Debian — русские имена файлов и папок стали нечитаемы. Например папка которая называлась «Город 312» теперь зовётся «Ð“ород 312» та же картина с именами файлов. Можно как-то спасти ситуацияю? Реально, кроме музыки там было ещё очень много ценных документов, для работы.
Re: Решено: Искорёжены русские имена файлов
Сообщение sciko » 21.09.2009 19:59
watashiwa_daredeska Бывший модератор Сообщения: 4038 Статус: Искусственный интеллект (pre-alpha) ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Atolstoy Сообщения: 1654 Статус: Tux in the rain ОС: Linux x86_64 Контактная информация:
Re: Решено: Искорёжены русские имена файлов
Сообщение Atolstoy » 21.09.2009 21:29
Монтируем раздел так:
mount /dev/sda1 /mnt/docs -t vfat -o codepage=866 iocharset=cp1251
вместа sda1 и docs подставляй своё.
Всего лишь 26 литров пива достаточно человеку для удовлетворения ежедневной потребности в кальции. Здоровое питание — это так просто!
http://atolstoy.wordpress.com
Bizdelnick Модератор Сообщения: 20385 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Сообщение Bizdelnick » 21.09.2009 23:04
Монтируем раздел так:
mount /dev/sda1 /mnt/docs -t vfat -o codepage=866 iocharset=cp1251
вместа sda1 и docs подставляй своё.
mount -t vfat -o utf8 /dev/sda1 /mnt/docs
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Решено: Искорёжены русские имена файлов
Параметры монтирования в том live-cd сказать не могу, его в меня больше нет. В Debian, который сейчас использую монтируется автоматически, как любая флешка или т.п. В ручную тоже пробовала разные параменты — не помогало. Из посоветованных выше -o codepage=866,iocharset=cp1251 превращает крокозябры (кроме цифр) в вопросительные знаки, а c -o utf8 результат ничем не отличается от автоматического.
Вообще, очень похоже на UTF-8, т.к. каждая русская буква превратилась в две крокозябры (русские буквы в UTF-8 кодируются как раз двумя байтами), но почему не работает параметр utf-8 -не знаю.
Bizdelnick Модератор Сообщения: 20385 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Сообщение Bizdelnick » 22.09.2009 11:29
mount -t vfat -o utf8,iocharset=utf8 /dev/sda1 /mnt/docs
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Решено: Искорёжены русские имена файлов
mount -t vfat -o utf8,iocharset=utf8 /dev/sda1 /mnt/docs
anny@laptop:~$ locale LANG=ru_RU.UTF-8 LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=
-o utf8,iocharset=utf8 не помогло — остались те же крокозябры
Atolstoy Сообщения: 1654 Статус: Tux in the rain ОС: Linux x86_64 Контактная информация:
Re: Решено: Искорёжены русские имена файлов
Сообщение Atolstoy » 22.09.2009 12:38
Всего лишь 26 литров пива достаточно человеку для удовлетворения ежедневной потребности в кальции. Здоровое питание — это так просто!
http://atolstoy.wordpress.com
Bizdelnick Модератор Сообщения: 20385 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Сообщение Bizdelnick » 22.09.2009 12:48
Тогда могу только предположить, что диск был криво смонтирован с livecd (например с utf8,iocharset=iso8859-1), и имена файлов записались коряво. Тогда надо не подбирать опции монтирования, а думать, как сконвертить имена файлов в нормальные.
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Решено: Искорёжены русские имена файлов
Тогда могу только предположить, что диск был криво смонтирован с livecd (например с utf8,iocharset=iso8859-1), и имена файлов записались коряво. Тогда надо не подбирать опции монтирования, а думать, как сконвертить имена файлов в нормальные.
Вполне возможно, live-cd был довольно старым и не русским. На исходном разделе имена файлов были в UTF-8, вполне возможно, что он неверно ститал их, не говоря уже о том, чтобы правильно записать.
Bizdelnick Модератор Сообщения: 20385 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Сообщение Bizdelnick » 22.09.2009 13:03
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Решено: Искорёжены русские имена файлов
Re: Решено: Искорёжены русские имена файлов
немного некрасивый совет, но все же.
попробуйте на смонтированом диске сделать
ls | recode utf-8..windows-1251
или
ls | recode utf-8..cp866
возможно придется поставить recode.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Re: Решено: Искорёжены русские имена файлов
немного некрасивый совет, но все же.
попробуйте на смонтированом диске сделать
ls | recode utf-8..windows-1251
или
ls | recode utf-8..cp866
возможно придется поставить recode.
Сейчас обязательно попробую
Интересная вещь (это тот же самый «Город 312»):
anny@laptop:~/test$ ls | hexdump -C 00000000 c3 90 c2 93 c3 90 c2 be c3 91 c2 80 c3 90 c2 be |. | 00000010 c3 90 c2 b4 20 33 31 32 0a |. 312.| 00000019
Тобишь 4 байта (. ) на букву, по видимому одиночным кодированием utf-8 из/в однобайтовую кодировку тут отделаться не получится ((((
Re: Решено: Искорёжены русские имена файлов
немного некрасивый совет, но все же.
попробуйте на смонтированом диске сделать
ls | recode utf-8..windows-1251
или
ls | recode utf-8..cp866
Замечательный совет. Спасибо Вам огромнейшее. Правда те два варианта, что вы предложили не подошли, но сайт http://www.artlebedev.ru/tools/decoder/ подтвердил догадку Bizdelnick о присутствии кодировки ISO-8859-1.
anny@laptop:~/test$ ls | recode UTF-8..ISO-8859-1..UTF-8 Город 312
Re: Решено: Искорёжены русские имена файлов
ну, вообще для этого существует convmv, но я не знаю, можно ли ей сделать такую последовательность.
если не получится — пишите, набросаем скриптик.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Re: Решено: Искорёжены русские имена файлов
convmv заставить корректно переименовывать файлы не удалось, вообще, он не умеет делать больше одной перекодировки, а казалось бы эквивалентное разбиение на UTF-8 -> ISO-8859-1 и ISO-8859-1 -> UTF-8 не даёт ничего хорошего, видимо чего-то не понимаю. пришлось сочинять скрипты в меру своего знания shell. скрипт для переименовывания одного файла или каталога работает прекрасно, а вот как заставить его конвертировать их пачками придумать не получилось.
1.sh для перекодировки 1 файла или папки:
#!/bin/bash fn="$1" bn="`basename "$fn"`" dn="`dirname "$fn"`" nn="`echo "$bn" | recode UTF-8..ISO-8859-1..UTF-8`" mv "$fn" "$dn"/"$nn"
Причём есть одна проблема — нужно заэкранировать все пробелы в имени файла, чтобы оно не распадалось на несколько параметров.
Как поступить дальше — не знаю. Очевидно, что нужно организовать рекурсию по всем подкаталогам, причём начиная с наиболее «дальних». find с параметром -exec в чистом виде не подошел — во первых он добавляет какие-то странные знаки в конец некоторых имён подкаталогов, во вторых он не хочет выдавать результаты «в обратном порядке». В голову пришёл вот такой вариант организации цикла:
for file in $(find "$1" -type d | sort -r)
Но и тут не всё гладко — for разбивает строку на составляющие и по \n и по пробелам, т.е. если в имени файла или папки есть пробел — оно делится пополам.
Ох! Сейчас плюну на этот Shell и сделаю всё на Яве )))))
Rootlexx Бывший модератор Сообщения: 4443 Статус: GNU generation ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Сообщение Rootlexx » 23.09.2009 03:00
#!/bin/bash # Set your recoding sequence here. RECODE_SEQUENCE="UTF-8..ISO-8859-1..UTF-8"; EXIT_SUCCESS=0; EXIT_FAILURE=1; START_DIR="$"; PROG_NAME="$(basename "$0")"; LOG_FILE="$HOME/$PROG_NAME-$(date).log"; NEEDED_APPS="readlink recode"; function real_path() < local path="$"; readlink -mn "$path"; > function is_num() < local num="$"; case "$num" in *[!0-9]*) return 1;; esac return 0; > function error() < local exit="$" error="$" reason="$3"; if ! is_num "$exit"; then exit=""; : $ fi printf "%s: %s" "$PROG_NAME" "$error" >&2; if [ -n "$reason" ]; then printf ": %s" "$reason" >&2; fi printf "\n" >&2; if [ $exit -ne $EXIT_SUCCESS ]; then exit $exit; fi > function recode_name() < local name="$"; if ! printf "%s" "$name" | recode "$RECODE_SEQUENCE" 2>> "$LOG_FILE"; then error $EXIT_FAILURE "some error occured while recoding; see \`$LOG_FILE$(printf \\x27) for details"; fi > function recursive_recode() < local element="", new_name=""; for element in *; do new_name="$(recode_name "$element")"; if [ -z "$new_name" ]; then error $EXIT_FAILURE "new name is empty — maybe a \"recode\" bug?"; fi if [ "$element" != "$new_name" ] && ! mv -v "$(real_path "$element")" "$(real_path "$new_name")" >> "$LOG_FILE" 2>&1; then error $EXIT_FAILURE "cannot rename an element; see \`$LOG_FILE$(printf \\x27) for details"; fi if [ -d "$new_name" ]; then if ! cd "$(real_path "$new_name")" 2>> "$LOG_FILE"; then error $EXIT_FAILURE "cannot change directory; see \`$LOG_FILE$(printf \\x27) for details"; fi recursive_recode; cd ..; fi done > for app in $NEEDED_APPS; do if ! which $app &> /dev/null; then error $EXIT_FAILURE "a critical program \"$app\" is not installed"; fi done if ! cd "$START_DIR" &> /dev/null; then error $EXIT_FAILURE "cannot change to start directory"; fi printf "Starting recoding process. \nYou can find logs in \`%s\x27\nWait\x27n\x27Pray. \n" "$LOG_FILE"; recursive_recode; printf "Done\x21\n\a";
— должно работать, но писалось на скорую руку и не тестировалось, так что лучше испытать на небольшой копии исходной задачи.
На всякий случай создаётся подробный журнал совершаемых действий, а при любых ошибках происходит немедленный выход. Файл журнала создаётся в домашнем каталоге по алгоритму «название_скрипта-дата_и_время_запуска.log».
Критикам: да, скрипт несколько перегружен, но привычка берёт своё . Вспомогательные функции вроде error() были написаны ранее.
watashiwa_daredeska Бывший модератор Сообщения: 4038 Статус: Искусственный интеллект (pre-alpha) ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Тобишь 4 байта (. ) на букву, по видимому одиночным кодированием utf-8 из/в однобайтовую кодировку тут отделаться не получится ((((
Хм. Если текст UTF-8 приняли за ISO-8859-1 и перекодировали в UTF-8 еще раз, то перекодирования UTF-8->ISO-8859-1 должно дать нормальный UTF-8.
P.S. Проверил по кодам, которые есть выше — работает. Т.е., чтобы получить utf-8, надо перекодировать из utf-8 в iso-8859-1.