加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 卷曲到tar用管子拉链

发布时间:2020-12-15 21:22:19 所属栏目:安全 来源:网络整理
导读:我想下载一个tar.gz存档,解压缩并将其压缩成zip文件,并在一个命令中使用bash脚本.原因是独立于临时文件. 我使用的代码: curl -L "someURL" | tar xOz --strip-components=1 | zip -@ test.zip 给STDOUT提供了很多输出,所以我猜zip不接受管道. 也许我在这里
我想下载一个tar.gz存档,解压缩并将其压缩成zip文件,并在一个命令中使用bash脚本.原因是独立于临时文件.

我使用的代码:

curl -L "someURL" | tar xOz --strip-components=1 | zip -@ test.zip

给STDOUT提供了很多输出,所以我猜zip不接受管道.

也许我在这里遗漏了一些东西,但是zip的手册页并没有给我提供更多的信息,而不是使用 – 或 – 或互联网.

解决方法

zip的联机帮助页(至少在我的系统上):

If a file list is specified as -@ [Not on MacOS],zip takes the list of input files from standard input instead of from the command line. For example,
zip -@ foo
will store the files listed one per line on stdin in foo.zip.

tar的联机帮助页

-O,--to-stdout
?????????????extract files to standard output.

简而言之:

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流.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读