Решено: Искорёжены русские имена файлов
Модератор: Bizdelnick
-
- Сообщения: 39
Решено: Искорёжены русские имена файлов
После нехорошего одного сбоя мне пришлось спасать данные с жесткого диска (раздел ext3) на съемный (форматирован в fat32). Видимо мой live-cd как-то некорреутно поддерживал русские имена файлов, или я выставила неправильные параметры монтирования, но когда я подмонтировала этот диск в свежеустановленном Debian - русские имена файлов и папок стали нечитаемы. Например папка которая называлась "Город 312" теперь зовётся "Город 312" та же картина с именами файлов. Можно как-то спасти ситуацияю? Реально, кроме музыки там было ещё очень много ценных документов, для работы.
-
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Решено: Искорёжены русские имена файлов
Я так понимаю параметры монтирования мы должны получить через libastral.so?
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Чем? Как? С какими параметрами?marsianna4ka писал(а): ↑21.09.2009 19:55когда я подмонтировала этот диск в свежеустановленном Debian
Мои розовые очки
-
- Сообщения: 1655
- Статус: Tux in the rain
- ОС: Linux x86_64
Re: Решено: Искорёжены русские имена файлов
Монтируем раздел так:
mount /dev/sda1 /mnt/docs -t vfat -o codepage=866 iocharset=cp1251
вместа sda1 и docs подставляй своё.
mount /dev/sda1 /mnt/docs -t vfat -o codepage=866 iocharset=cp1251
вместа sda1 и docs подставляй своё.
Всего лишь 26 литров пива достаточно человеку для удовлетворения ежедневной потребности в кальции. Здоровое питание - это так просто!
http://atolstoy.wordpress.com
http://atolstoy.wordpress.com
-
- Модератор
- Сообщения: 21243
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
По-моему, там как раз UTF-8. Я бы смонтировал так:
Код: Выделить всё
mount -t vfat -o utf8 /dev/sda1 /mnt/docs
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
Параметры монтирования в том live-cd сказать не могу, его в меня больше нет. В Debian, который сейчас использую монтируется автоматически, как любая флешка или т.п. В ручную тоже пробовала разные параменты - не помогало. Из посоветованных выше -o codepage=866,iocharset=cp1251 превращает крокозябры (кроме цифр) в вопросительные знаки, а c -o utf8 результат ничем не отличается от автоматического.
Вообще, очень похоже на UTF-8, т.к. каждая русская буква превратилась в две крокозябры (русские буквы в UTF-8 кодируются как раз двумя байтами), но почему не работает параметр utf-8 -не знаю...
-
- Модератор
- Сообщения: 21243
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
А локаль-то какая?
Если UTF-8, то можно попробоватьхотя у меня и как я выше писал нормально монтировалось.
Код: Выделить всё
locale
Если UTF-8, то можно попробовать
Код: Выделить всё
mount -t vfat -o utf8,iocharset=utf8 /dev/sda1 /mnt/docs
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
Bizdelnick писал(а): ↑22.09.2009 11:29А локаль-то какая?Код: Выделить всё
locale
Если UTF-8, то можно попробоватьхотя у меня и как я выше писал нормально монтировалось.Код: Выделить всё
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 не помогло - остались те же крокозябры
-
- Сообщения: 1655
- Статус: Tux in the rain
- ОС: Linux x86_64
Re: Решено: Искорёжены русские имена файлов
Попробуй ещё koi8-r.
Всего лишь 26 литров пива достаточно человеку для удовлетворения ежедневной потребности в кальции. Здоровое питание - это так просто!
http://atolstoy.wordpress.com
http://atolstoy.wordpress.com
-
- Модератор
- Сообщения: 21243
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Тогда могу только предположить, что диск был криво смонтирован с livecd (например с utf8,iocharset=iso8859-1), и имена файлов записались коряво. Тогда надо не подбирать опции монтирования, а думать, как сконвертить имена файлов в нормальные.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
Bizdelnick писал(а): ↑22.09.2009 12:48Тогда могу только предположить, что диск был криво смонтирован с livecd (например с utf8,iocharset=iso8859-1), и имена файлов записались коряво. Тогда надо не подбирать опции монтирования, а думать, как сконвертить имена файлов в нормальные.
Вполне возможно, live-cd был довольно старым и не русским... На исходном разделе имена файлов были в UTF-8, вполне возможно, что он неверно ститал их, не говоря уже о том, чтобы правильно записать...
-
- Модератор
- Сообщения: 21243
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
А если, кстати, смонтировать с теми опциями, что я написал в скобках?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
Bizdelnick писал(а): ↑22.09.2009 13:03А если, кстати, смонтировать с теми опциями, что я написал в скобках?
Всё без изменений
-
- Бывший модератор
- Сообщения: 2760
- ОС: Debian; gentoo
Re: Решено: Искорёжены русские имена файлов
немного некрасивый совет, но все же.
попробуйте на смонтированом диске сделать
ls | recode utf-8..windows-1251
или
ls | recode utf-8..cp866
чего покажет?
возможно придется поставить recode.
попробуйте на смонтированом диске сделать
ls | recode utf-8..windows-1251
или
ls | recode utf-8..cp866
чего покажет?
возможно придется поставить recode.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
Ленивая Бестолочь писал(а): ↑22.09.2009 13:36немного некрасивый совет, но все же.
попробуйте на смонтированом диске сделать
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 из/в однобайтовую кодировку тут отделаться не получится ((((
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
Ленивая Бестолочь писал(а): ↑22.09.2009 13:36немного некрасивый совет, но все же.
попробуйте на смонтированом диске сделать
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
Остаётся придумать, как автоматизировать процесс переименовывания файлов...
-
- Бывший модератор
- Сообщения: 2760
- ОС: Debian; gentoo
Re: Решено: Искорёжены русские имена файлов
ну, вообще для этого существует convmv, но я не знаю, можно ли ей сделать такую последовательность.
если не получится - пишите, набросаем скриптик.
если не получится - пишите, набросаем скриптик.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
convmv заставить корректно переименовывать файлы не удалось, вообще, он не умеет делать больше одной перекодировки, а казалось бы эквивалентное разбиение на UTF-8 -> ISO-8859-1 и ISO-8859-1 -> UTF-8 не даёт ничего хорошего, видимо чего-то не понимаю... пришлось сочинять скрипты в меру своего знания shell... скрипт для переименовывания одного файла или каталога работает прекрасно, а вот как заставить его конвертировать их пачками придумать не получилось.
1.sh для перекодировки 1 файла или папки:
Причём есть одна проблема - нужно заэкранировать все пробелы в имени файла, чтобы оно не распадалось на несколько параметров.
Как поступить дальше - не знаю. Очевидно, что нужно организовать рекурсию по всем подкаталогам, причём начиная с наиболее "дальних". find с параметром -exec в чистом виде не подошел - во первых он добавляет какие-то странные знаки в конец некоторых имён подкаталогов, во вторых он не хочет выдавать результаты "в обратном порядке". В голову пришёл вот такой вариант организации цикла:
Но и тут не всё гладко - for разбивает строку на составляющие и по \n и по пробелам, т.е. если в имени файла или папки есть пробел - оно делится пополам...
Ох! Сейчас плюну на этот 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 и сделаю всё на Яве )))))
-
- Бывший модератор
- Сообщения: 4458
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Код: Выделить всё
#!/bin/bash
# Set your recoding sequence here.
RECODE_SEQUENCE="UTF-8..ISO-8859-1..UTF-8";
EXIT_SUCCESS=0;
EXIT_FAILURE=1;
START_DIR="${1:?"Directory name expected"}";
PROG_NAME="$(basename "$0")";
LOG_FILE="$HOME/$PROG_NAME-$(date).log";
NEEDED_APPS="readlink recode";
function real_path()
{
local path="${1:?"Filename expected"}";
readlink -mn "$path";
}
function is_num()
{
local num="${1:?"No number specified"}";
case "$num" in
*[!0-9]*)
return 1;;
esac
return 0;
}
function error()
{
local exit="${1:?"No exit value specified"}" error="${2:?"No error message specified"}" reason="$3";
if ! is_num "$exit"; then
exit="";
: ${exit:?"Not a number"}
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="${1:?"No name string specified"}";
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».
Критикам: да, скрипт несколько перегружен, но привычка берёт своё

-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Хм... Если текст UTF-8 приняли за ISO-8859-1 и перекодировали в UTF-8 еще раз, то перекодирования UTF-8->ISO-8859-1 должно дать нормальный UTF-8.marsianna4ka писал(а): ↑22.09.2009 14:05Тобишь 4 байта (!!!) на букву, по видимому одиночным кодированием utf-8 из/в однобайтовую кодировку тут отделаться не получится ((((
P.S. Проверил по кодам, которые есть выше — работает. Т.е., чтобы получить utf-8, надо перекодировать из utf-8 в iso-8859-1.
Мои розовые очки
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
watashiwa_daredeska писал(а): ↑23.09.2009 11:44Хм... Если текст UTF-8 приняли за ISO-8859-1 и перекодировали в UTF-8 еще раз, то перекодирования UTF-8->ISO-8859-1 должно дать нормальный UTF-8.marsianna4ka писал(а): ↑22.09.2009 14:05Тобишь 4 байта (!!!) на букву, по видимому одиночным кодированием utf-8 из/в однобайтовую кодировку тут отделаться не получится ((((
P.S. Проверил по кодам, которые есть выше — работает. Т.е., чтобы получить utf-8, надо перекодировать из utf-8 в iso-8859-1.
Но не забывайте, что из приведённых выше кодов не достаточно получить просто байты UTF-8, т.к. каждый из них в этом случае закодируется во внутреннем представлении файловой системы как отдельный символ юникода в UTF-8. Нужно получить именно юникод (для линукс это будет UTF-32), который передать ОС, чтобы всё было корректно закодировано во внутреннем представлении... Мне это сложно объяснить словами.
-
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Решено: Искорёжены русские имена файлов
С учётом вышеописанного раздел надо монтировать как-то так:
или
Хотя iconv настаивает на 1 варианте.
Естественно вместо sda1 и docs подставить своё.
Код: Выделить всё
mount /dev/sda1 /mnt/docs -t vfat -o codepage=866 iocharset=cp1252
Код: Выделить всё
mount /dev/sda1 /mnt/docs -t vfat -o codepage=866 iocharset=iso8859-1
Хотя iconv настаивает на 1 варианте.
Естественно вместо sda1 и docs подставить своё.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Потому что нет слов для объяснения того, чего нет

Работа с файловой системой ведется в той кодировке, в которой работает пользователь. fat32? Значит ее просто надо смонтировать с опциями -o codepage=866,utf8. ext2/3/...? Ничего не надо делать — у нее 8-битная кодировка имен файлов и ничего никуда не перекодируется.
Только на Яве не надо писать

Мои розовые очки
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Решено: Искорёжены русские имена файлов
Итак, попытался воспроизвести ситуацию. Аналогичный результат получается, если:
1. Смонтировать с опциями codepage=866,iocharset=iso8859-1
2. Создать папку 'Город 312'
3. Отмонтировать
4. Смонтировать с опцией utf8
По команде ls видим:
Т.е. достаточно примонтировать с опциями codepage=866,iocharset=iso8859-1 и всё будет отлично видно.
1. Смонтировать с опциями codepage=866,iocharset=iso8859-1
2. Создать папку 'Город 312'
3. Отмонтировать
4. Смонтировать с опцией utf8
По команде ls видим:
Код: Выделить всё
~$ ls mnt/tmp | hd
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
Т.е. достаточно примонтировать с опциями codepage=866,iocharset=iso8859-1 и всё будет отлично видно.
Мои розовые очки
-
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Решено: Искорёжены русские имена файлов
Отличная_шутка.jpegmarsianna4ka писал(а): ↑23.09.2009 12:06Нужно получить именно юникод (для линукс это будет UTF-32), который передать ОС, чтобы всё было корректно закодировано во внутреннем представлении...
1. Путаем юникод и UTF.
2. Линукс использует UTF-8, я гарантирую это.
3. UTF-16 вроде бы кто-то и использует, а вот UTF-32 -- никто.
4. Отсутствует представление о файловой системе Unix-like ОС.
Последний пункт попытаюсь восполнить. В Unix-like ОС есть такая абстракция: "всё -- файл". Т.е. проще говоря, каталог Линукс рассматривает тоже как файл. А для того, чтобы прочитать файл правильно, надо знать его кодировку. Вот эта кодировка и задаётся в параметрах монтирования.
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
Код: Выделить всё
anny@laptop:~$ sudo mount /dev/sdb1 /media/ehdd/ -t vfat -o codepage=866 -o iocharset=cp1251
anny@laptop:~$ cd /media/ehdd/Music/
anny@laptop:/media/ehdd/Music$ ls
??????
????????
????????????????????
??????????????????
????????????????
........
Код: Выделить всё
anny@laptop:/media/ehdd/Music$ cd ~
anny@laptop:~$ sudo umount /media/ehdd/
anny@laptop:~$ sudo mount /dev/sdc1 /media/ehdd/ -t vfat -o codepage=866 -o iocharset=iso8859-1
anny@laptop:~$ cd /media/ehdd/Music/
anny@laptop:/media/ehdd/Music$ ls
??????
????????
????????????????????
??????????????????
????????????????
??????
...
-
- Сообщения: 39
Re: Решено: Искорёжены русские имена файлов
1. Не спорю
2. Не спорю
3. Не спорю
4. Не спорю
Я вижу, что меня здесь заведомо считают дурой, посему дальнейший спор считаю нецелесообразным. Скрипт, написанный Rootlexx с некоторыми изменениями прекрасно работает и вполне корректно переименовал мне все ошибочные файлы, можете на досуге подумать, почему, и почему не работает ваш способ с -o codepage=866,iocharset=iso8859-1, я высказала предположение, да, я пользователь и не рабираюсь во многих тонкостях, но так или иначе - свою проблему я считаю решённой. Спасибо и удачи всем.
-
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Решено: Искорёжены русские имена файлов
Вообще-то новичком. На это нам как бы намекает название раздела.
Спор с чем? Какой из 4 пунктов не устраивает?
Возможно потому, что надо было ввестиmarsianna4ka писал(а): ↑23.09.2009 13:09можете на досуге подумать, почему, и почему не работает ваш способ с -o codepage=866,iocharset=iso8859-1
Код: Выделить всё
$ sudo mount /dev/sdb1 /media/ehdd/ -t vfat -o iocharset=cp125[b]2[/b]
Где тонкости? Это тонкости? Это основы, которые должен знать каждый.marsianna4ka писал(а): ↑23.09.2009 13:09я высказала предположение, да, я пользователь и не рабираюсь во многих тонкостях
Я думаю будет православным добавить в заголовок "[Таки РЕШЕНО]".