Есть ли способ конвертировать zip в tar без извлечения его в файловую систему?

Есть ли способ конвертировать zip архив в архив tar без предварительного извлечения во временный каталог? (и без написания моей собственной реализации tar или unzip )

3 Solutions collect form web for “Есть ли способ конвертировать zip в tar без извлечения его в файловую систему?”

Это теперь доступно как устанавливаемая команда из PyPI, см. Конец этой публикации.


Я не знаю ни одной «стандартной» утилиты, которая делает это, но когда мне нужна эта функциональность, я написал следующий скрипт Python для перехода из ZIP в сжатые tar-архивы Bzip2 без предварительного извлечения чего-либо на диск:

 #! /usr/bin/env python """zip2tar """ import sys import os from zipfile import ZipFile import tarfile import time def main(ifn, ofn): with ZipFile(ifn) as zipf: with tarfile.open(ofn, 'w:bz2') as tarf: for zip_info in zipf.infolist(): #print zip_info.filename, zip_info.file_size tar_info = tarfile.TarInfo(name=zip_info.filename) tar_info.size = zip_info.file_size tar_info.mtime = time.mktime(list(zip_info.date_time) + [-1, -1, -1]) tarf.addfile( tarinfo=tar_info, fileobj=zipf.open(zip_info.filename) ) input_file_name = sys.argv[1] output_file_name = os.path.splitext(input_file_name)[0] + '.tar.bz2' main(input_file_name, output_file_name) 

Просто сохраните его в zip2tar и сделайте его исполняемым или сохраните на zip2tar.py и запустите python zip2tar.py . Укажите имя файла ZIP в качестве аргумента скрипту, выходным именем файла для xyz.zip будет xyz.tar.bz2 .

Сжатый вывод Bzip2 обычно намного меньше, чем zip-файл, поскольку последний не использует шаблоны сжатия по нескольким файлам, но также есть меньше шансов восстановить более поздний файл, если что-то в файле Bzip2 неверно.

Если вы не хотите, чтобы результат был сжат, удалите :bz2 и .bz2 из кода.


Если у вас установлен протокол python3, вы можете сделать следующее:

 pip3 install ruamel.zip2tar 

для получения zip2tar командной строки zip2tar выполняющей вышеуказанное (отказ от ответственности: я являюсь автором этого пакета).

Команда tar работает с файловыми системами. Он представляет собой список файлов, которые затем читаются из файловой системы (включая множество метаданных). Вам нужно будет представить zip-файл в качестве файловой системы для команды tar чтобы ее прочитать.

Виртуальная файловая система – AVFS позволит любой программе просматривать архивные или сжатые файлы через стандартный интерфейс файловой системы через FUSE .

В файле avfs-fuse есть некоторая подробная информация, и в некоторых дистрибутивах есть пакеты для него.

У вас установлен AVFS, тогда вы можете

 mountavfs cd ~/.avfs/path/to/somefile.zip# tar -cvf /path/whatever.tar . 

AVFS будет заполнять любую информацию для файловой системы, отсутствующую в zip-файле, например, в отношении владения файлами, который будет загружен tar.

Вот небольшой фрагмент, который конвертирует ZIP-архив в соответствующий архив TAR.GZ OnTheFly.

Конвертировать ZIP-архив в архив TAR на лету

 # File: zip2tar.py # # Convert ZIP archive to TAR.GZ archive. # # Written by Fredrik Lundh, March 2005. # helpers (tweak as necessary) def getuser(): # return user name and user id return "anonymous", 1000 def getmode(name, data): # return mode ("b" or "t") for the given file. # you can do this either by inspecting the name, or # the actual data (eg by looking for non-ascii, non- # line-feed data). return "t" # assume everything's text, for now # # main import tarfile import zipfile import glob, os, StringIO, sys, time now = time.time() user = getuser() def fixup(infile): file, ext = os.path.splitext(infile) outfile = file + ".tar.gz" dirname = os.path.basename(file) print outfile zip = zipfile.ZipFile(infile, "r") tar = tarfile.open(outfile, "w:gz") tar.posix = 1 for name in zip.namelist(): if name.endswith("/"): continue data = zip.read(name) if getmode(name, data) == "t": data = data.replace("\r\n", "\n") tarinfo = tarfile.TarInfo() tarinfo.name = name tarinfo.size = len(data) tarinfo.mtime = now tarinfo.uname = tarinfo.gname = user[0] tarinfo.uid = tarinfo.gid = user[1] tar.addfile(tarinfo, StringIO.StringIO(data)) tar.close() zip.close() # convert all ZIP files in the current directory for file in glob.glob("*.zip"): fixup(file) 

Источник

  • Неоднократно застегивая файл, который был недавно создан, но идентичен, однако shasum zip продолжает меняться
  • Раскройте архив gz с расширением zip
  • Как подождать, пока команда mv завершится в unix?
  • Zip содержимое каталога без самой директории
  • синхронизировать два zip-архива (с минимальным вводом-выводом)?
  • офисные файлы читаются в виде zip-архива и наоборот. Как я могу решить это?
  • Как распаковать несколько каталогов с zip-файлами, которые также содержат подкаталоги с zip-файлами?
  • Найти файл во многих zip-файлах (например, найти команду для каталогов)
  • Unrar несколько частей
  • Как только застегивать файлы определенного пользователя?
  • Как зашифровать каталог с помощью шифрования имен файлов?
  • Linux и Unix - лучшая ОС в мире.