среда, 25 августа 2010 г.

Unzip, cp1251 и UTF-8 - исправляем русские имена файлов

Распаковывая виндовые архивы с русскими именами файлов столкнулся с неприятной особенностью. Имена файлов не то что нечитабельные, они вообще непригодные для работы с ними. Ни открыть, ни скопировать толком... Достало. Пришлось лечить. Предлагаю мой отшлифованный и отлаженный вариант костыля.

Поиски по инету дали только один вариант решения проблемы - утилита convmv (не забудьте aptitude install ее для начала). Поскольку проблема все же встречается не настолько часто, чтобы выучить параметры команды наизусть, решено было написать баш-скриптец. К тому же, кодировкa имен файлов в zip совсем странная, и лечится в два прохода.

В общем, вот он - мой "шедевр" после часа борьбы с башем (уф-ф-ф, ну и язык!):
#!/bin/bash
for f in "$@"; do
    echo $f
    convmv -f cp1252 -t cp850 "$f" --notest --nosmart
    convmv -f cp866 -t utf-8 "`echo "$f" | iconv -f cp1252 -t cp850`" --notest --nosmart
done
Сохраняем, это, например, в файл ~/bin/convfn2utf8. Если папки bin ранее не было, не забудьте убедиться, что в ~/.profile есть строчка PATH="$HOME/bin:$PATH", после чего нужно перезапустить сеанс. И, конечно, chmod u+x ~/bin/convfn2utf8, чтобы можно было его запустить.

Теперь после распаковки достаточно натравить скрипт на файл. Конечно, поскольку имя не читабельное, то оно и не писабельное. Можно делать так:
$ convfn2utf8 *
или
$ convfn2utf8 *.doc
или
$ convfn2utf8 ???????????????.???
В общем, шаблоны вам помогут.

12 комментариев:

  1. Мне, помнится, помогло
    unzip -Z
    (ZipInfo mode)

    ОтветитьУдалить
  2. Что-то в этом режиме у меня вообще ничего не распаковывает. Только все теже испорченные имена файлов выводит.

    ОтветитьУдалить
  3. и где вы были раньше!!!
    Мне оставили документацию к нескольким системам в таком вот зип-архиве :(

    ОтветитьУдалить
  4. Раньше мне было лениво разбираться с этим :)

    Кстати, на днях мне прислали rar. С русскими именами никаких проблем не возникло.

    ОтветитьУдалить
  5. В проекте RusXMMS сделали специальный патч, в том числе и на unzip, который исправляет эту проблему.
    Плюс можно попробовать сменить локаль только для этого приложения.

    ОтветитьУдалить
  6. Спасибо, довольно полезно! баш не обижать! =)

    ОтветитьУдалить
  7. благодарю за сэкономленное время))

    на php исправил имена файлов после unzip:
    $curtitle = iconv("cp1252", "cp850", $curtitle);
    $curtitle = iconv("cp866", "utf-8", $curtitle);

    ОтветитьУдалить
  8. Ващ скрипт спотыкается на именах с пробелом, ниже вариант основанный на Вашем, но справляется с пробелами
    #!/bin/bash

    if [ -z "$1" ]; then
    echo -e "Recover wrong encoding in files names on russian\nUsage: $0 file(s)";
    exit 1;
    fi;

    while [ $# -gt 0 ]; do
    file=$1; shift;
    echo "file ---$file---"
    convmv -f cp1252 -t cp850 "$file" --notest --nosmart
    convmv -f cp866 -t utf-8 "`echo "$file" | iconv -f cp1252 -t cp850`" --notest --nosmart
    done

    ОтветитьУдалить
  9. Этот комментарий был удален автором.

    ОтветитьУдалить
  10. Не учитыается и в том и в другмо случае папки ;*( файл конвертится но с папками легче не становится.

    ОтветитьУдалить
  11. Проще так сделать:
    unzip -O cp1252 ./rus.zip

    ОтветитьУдалить