среда, 25 августа 2010 г.
Unzip, cp1251 и UTF-8 - исправляем русские имена файлов
Распаковывая виндовые архивы с русскими именами файлов столкнулся с неприятной особенностью. Имена файлов не то что нечитабельные, они вообще непригодные для работы с ними. Ни открыть, ни скопировать толком... Достало. Пришлось лечить. Предлагаю мой отшлифованный и отлаженный вариант костыля.
Поиски по инету дали только один вариант решения проблемы - утилита convmv (не забудьте aptitude install ее для начала). Поскольку проблема все же встречается не настолько часто, чтобы выучить параметры команды наизусть, решено было написать баш-скриптец. К тому же, кодировкa имен файлов в zip совсем странная, и лечится в два прохода.
В общем, вот он - мой "шедевр" после часа борьбы с башем (уф-ф-ф, ну и язык!):
Теперь после распаковки достаточно натравить скрипт на файл. Конечно, поскольку имя не читабельное, то оно и не писабельное. Можно делать так:
Поиски по инету дали только один вариант решения проблемы - утилита 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 ???????????????.???В общем, шаблоны вам помогут.
Подписаться на:
Комментарии к сообщению (Atom)
12 комментариев:
Мне, помнится, помогло
Ответить Удалитьunzip -Z
(ZipInfo mode)
Что-то в этом режиме у меня вообще ничего не распаковывает. Только все теже испорченные имена файлов выводит.
Ответить Удалитьи где вы были раньше!!!
Ответить УдалитьМне оставили документацию к нескольким системам в таком вот зип-архиве :(
Раньше мне было лениво разбираться с этим :)
Ответить УдалитьКстати, на днях мне прислали rar. С русскими именами никаких проблем не возникло.
В проекте RusXMMS сделали специальный патч, в том числе и на unzip, который исправляет эту проблему.
Ответить УдалитьПлюс можно попробовать сменить локаль только для этого приложения.
Спасибо, довольно полезно! баш не обижать! =)
Ответить Удалитьблагодарю за сэкономленное время))
Ответить Удалитьна php исправил имена файлов после unzip:
$curtitle = iconv("cp1252", "cp850", $curtitle);
$curtitle = iconv("cp866", "utf-8", $curtitle);
Ващ скрипт спотыкается на именах с пробелом, ниже вариант основанный на Вашем, но справляется с пробелами
Ответить Удалить#!/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
Этот комментарий был удален автором.
Ответить УдалитьЭтот комментарий был удален автором.
УдалитьНе учитыается и в том и в другмо случае папки ;*( файл конвертится но с папками легче не становится.
Ответить УдалитьПроще так сделать:
Ответить Удалитьunzip -O cp1252 ./rus.zip