bash – 卷曲到tar用管子拉链
我想下载一个tar.gz存档,解压缩并将其压缩成zip文件,并在一个命令中使用bash脚本.原因是独立于临时文件.
我使用的代码: curl -L "someURL" | tar xOz --strip-components=1 | zip -@ test.zip 给STDOUT提供了很多输出,所以我猜zip不接受管道. 也许我在这里遗漏了一些东西,但是zip的手册页并没有给我提供更多的信息,而不是使用 – 或 – 或互联网. 解决方法
zip的联机帮助页(至少在我的系统上):
tar的联机帮助页
简而言之: tar -O可以在一个长流中将文件(但不是它们的名称)输出到stdout.但是zip需要stdin上的文件名列表.所以这不会起作用.并且很难看到如何使它工作,因为bash管道只是非结构化的字符串,但是要将信息从tar传输到zip,你需要添加一些结构,即使它是最小的: [filename][filedata][filename][filedata]... 发送者(tar)和接收者(zip)必须就该结构的格式达成一致.哪个不会发生. 但是,您可以使用除命令行实用程序之外的tar和zip接口.例如,如果安装了python,则以下内容应该有效: #!/usr/bin/python import sys import tarfile import zipfile tarf = tarfile.open(sys.argv[1],"r:*") zipf = zipfile.ZipFile(sys.argv[2],"w",zipfile.ZIP_DEFLATED) for m in tarf: if m.isreg(): zipf.writestr(m.path,tarf.extractfile(m).read()) (需要大量的错误检查.如上所述,它只会在任何错误时崩溃.) 你可以把它变成一个“一个非常长的线程”的shell,虽然我个人只是使??用上面的python脚本. python -c "$(printf %s 'import sys;import tarfile;import zipfile;' 'T=tarfile.open(sys.argv[1],"r:*")' 'Z=zipfile.ZipFile(sys.argv[2],zipfile.ZIP_DEFLATED);' '[Z.writestr(m.path,T.extractfile(m).read()) for m in T if m.isreg()]')" input.tar output.zip (如果你想从curl管道到那个,使用/ dev / stdin作为输入文件.我认为这将避免Python试图将stdin解释为UTF-8流.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |