Автор Гілка: Розпакування Zip з назвами файлів в Cp866  (Прочитано 2793 раз)

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Я використовую такий скрипт для вирішення проблеми з кириличними назвами файлів:

#!/bin/bash
for I in "$@"
do
  NEW_NAME="`echo -n "$I" | iconv -f cp1252 -t cp850 | iconv -f cp866`"
  [ "$I" == "$NEW_NAME" ] || mv "$I" "$NEW_NAME"
done

Суть проблеми в тому що unzip робить фіксоване перекодування CP850->Cp1252, тому для того щоб перекодувати назви файлів, треба спочатку перекодувати їх назад (iconv -f cp1252 -t cp850) а потім вже можна перекодовувати куди треба.

Див. також https://bugzilla.altlinux.org/show_bug.cgi?id=4871
[Fedora Linux]

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Гарний скрипт - тепер буду знати, як обходитись без if .  :)
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

anonymous

  • Гість
От лихо: в мене чогось вертикальні палички не відображає. Ану для тесту подам своє мінівдосконаленя вашого коду  :)
#sha bang
if [ $1 == "-l" ]
then
unzip -l "$2" | iconv -f cp1252 -t cp850 | iconv -f cp866
exit
fi
TMPDIR=$(mktemp)
rm  $TMPDIR
mkdir $TMPDIR
unzip "$1" -d "$TMPDIR"
PD=$(pwd)
cd "$TMPDIR"
for I in *
do
NEW_NAME="`echo -n "$I" | iconv -f cp1252 -t cp850 | iconv -f cp866`"
[ "$I" == "$NEW_NAME" ]  || mv "$I" "$NEW_NAME"
done
ls
mv * "$PD"
cd -
rmdir "$TMPDIR"