有没有办法将 zip 转换为 tar 而不将其解压缩到文件系统?

use*_*751 22 tar zip shell-script

有没有办法在不先解压到临时目录的情况下将zip存档转换为存档tar?(并且没有编写我自己的taror实现unzip

Ant*_*hon 14

这现在可以作为 PyPI 的可安装命令使用,请参阅本文末尾。


我不知道有任何“标准”实用程序可以这样做,但是当我需要此功能时,我编写了以下 Python 脚本,将 ZIP 压缩到 Bzip2 压缩 tar 存档,而无需先将任何内容提取到磁盘:

#! /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)
Run Code Online (Sandbox Code Playgroud)

只需将其保存到zip2tar并使其可执行或将其保存到zip2tar.py并运行python zip2tar.py. 提供 ZIP 文件名作为脚本的参数,输出文件xyz.zip名将为xyz.tar.bz2.

Bzip2 压缩输出通常比 zip 文件小得多,因为后者不会对多个文件使用压缩模式,但如果 Bzip2 文件中的某些内容出错,则恢复以后文件的机会也较小。

如果您不想压缩输出,请从代码中删除:bz2.bz2


如果你已经pip安装在python3环境中,你可以这样做:

pip3 install ruamel.zip2tar
Run Code Online (Sandbox Code Playgroud)

获取zip2tar执行上述操作的命令行实用程序(免责声明:我是该软件包的作者)。

  • 好一个。看起来脚本没有尝试复制元数据,例如跨存档格式更改的文件修改时间和权限,但我认为您可以很容易地添加它。 (2认同)

Mat*_*att 6

tar命令处理文件系统。它的输入是一个文件列表,然后从文件系统中读取(包括大量元数据)。您需要将 zip 文件作为文件系统显示,以便tar命令读取它。

虚拟文件系统 - AVFS将允许任何程序通过FUSE的标准文件系统接口查看存档或压缩文件的内部。

avfs-fuse readme 中有一些详细信息,一些发行版 它的

一个你已经安装了 AVFS,然后你就可以

mountavfs
cd ~/.avfs/path/to/somefile.zip#
tar -cvf /path/whatever.tar .
Run Code Online (Sandbox Code Playgroud)

AVFS 将填写 zip 中缺少的文件系统的任何信息,例如文件所有权,tar 将获取。