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执行上述操作的命令行实用程序(免责声明:我是该软件包的作者)。
该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 将获取。