Как я могу переупаковать zip в 7zip?

Как я могу безопасно и быстро переупаковать zip-архив в архив 7zip?

Я проверил параметры программы 7zip, но я не вижу возможности переупаковки. Я знаю, что могу извлечь в каталог, а затем упаковать этот каталог, но он безопасен? Что делать, если ZIP имеет такие пути, как «../../file.exe» или «/etc/bin/file.exe»?

  • поиск содержимого файлов, упакованных в zip-файл
  • Сжатие и удаление исходного каталога с ограниченным хранилищем
  • Я хочу понять Buildroot - 3 варианта конфигурации сжатия (kernel, initramfs & rootfs)
  • Восстановить содержимое файла Firefox .part?
  • Есть ли способ в BTRFS постоянно устанавливать сжатие?
  • scp и сжимать одновременно, без промежуточного сохранения
  • Я пробовал распаковывать файлы в stdout, и, хотя программа 7zip может это делать, она выводит только содержимое файлов без их имен и т. Д., Поэтому я не могу просто захватить этот вывод и перенаправить куда-нибудь, чтобы упаковать в архив 7zip.

  • Пытается сжать avi-файл, используя ffmpeg
  • Как распаковать многострочный (spanned) ZIP на Linux?
  • Ошибка с распаковкой файла .gz в Mint, но отлично работает в Windows, поэтому файл не поврежден
  • Разрешения Unzip (Info-ZIP)
  • Как включить сжатие HTTP?
  • Поиск файлов внутри нескольких подкаталогов и zip-каталогов
  • One Solution collect form web for “Как я могу переупаковать zip в 7zip?”

    Вам нужно будет извлечь их во временный каталог.

    Согласно unzip (1) ,

    Из соображений безопасности распаковка обычно удаляет компоненты пути «родительский dir» («../») из имен извлеченного файла. Эта функция безопасности (новая для версии 5.50) предотвращает несанкционированное извлечение файлов в «чувствительные» области вне активной ветви дерева папки извлечения.

    Поэтому, хотя это, скорее всего, безопасно , ваш результат 7z может иметь файлы, расположенные по-разному или даже отсутствующие, если имена файлов дублируются.

    Вот пример скрипта, но он игнорирует проблемы .. и абсолютного пути:

     #!/bin/sh set -e if [ "$1" == "" -o "$2" == "" ] then echo Usage: $0 archive.zip archive.7z exit 1 fi scratch=`mktemp -d` trap "rm -rf $scratch" EXIT in=`readlink -f $1` out=`readlink -f $2` if [ -f $out ] then echo $out exists. exit 2 fi unzip -d"$scratch" "$in" cd "$scratch" 7z a "$out" . 
    Linux и Unix - лучшая ОС в мире.