Поиски по инету дали только один вариант решения проблемы - утилита 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 ???????????????.???В общем, шаблоны вам помогут.
Мне, помнится, помогло
ОтветитьУдалить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