Linux русские имена файлов

Содержание
  1. Почему не работает кириллица в ubuntu в названиях файлов?
  2. unixforum.org
  3. Re: Решено: Искорёжены русские имена файлов
  4. Re: Решено: Искорёжены русские имена файлов
  5. Re: Решено: Искорёжены русские имена файлов
  6. Re: Решено: Искорёжены русские имена файлов
  7. Re: Решено: Искорёжены русские имена файлов
  8. Re: Решено: Искорёжены русские имена файлов
  9. Re: Решено: Искорёжены русские имена файлов
  10. Re: Решено: Искорёжены русские имена файлов
  11. Re: Решено: Искорёжены русские имена файлов
  12. Re: Решено: Искорёжены русские имена файлов
  13. Re: Решено: Искорёжены русские имена файлов
  14. Re: Решено: Искорёжены русские имена файлов
  15. Re: Решено: Искорёжены русские имена файлов
  16. Re: Решено: Искорёжены русские имена файлов
  17. Re: Решено: Искорёжены русские имена файлов
  18. Re: Решено: Искорёжены русские имена файлов
  19. Re: Решено: Искорёжены русские имена файлов
  20. Re: Решено: Искорёжены русские имена файлов
  21. 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 имя_файла

sergueik

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

Читайте также:  Usb rs485 converter linux

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), и имена файлов записались коряво. Тогда надо не подбирать опции монтирования, а думать, как сконвертить имена файлов в нормальные.

в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Читайте также:  Инвентаризация компьютеров сети linux

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 и по пробелам, т.е. если в имени файла или папки есть пробел — оно делится пополам.

Читайте также:  Linux ssl private key

Ох! Сейчас плюну на этот 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.

Источник

Оцените статью
Adblock
detector