You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在内存中将Zip文件拆分为多个Gzip文件?命令执行报错问题咨询

解决Zip文件内存内拆分压缩为多个Gzip文件的问题

我来帮你梳理下问题并给出可行的方案:

问题分析

  1. 第一条命令的问题:unzip a.zip默认会将文件解压到磁盘,同时把解压提示(比如Archive: a.zip inflating: data.txt)输出到stdout,而不是文件内容。就算你用-c参数,unzip还是会输出归档信息和文件名提示,这些都会被split捕获并压缩,导致结果不符合预期。
  2. 第二条命令的问题:split的参数顺序有误。当通过管道从stdin读取数据时,你需要把输出前缀(a_)放在所有选项之后,否则split会把a_当作要读取的输入文件,自然会报错找不到文件。

正确的解决方案

我们需要用unzip -p参数(pipe模式)来让unzip只输出文件内容到stdout,完全抑制所有提示信息,同时调整split的参数顺序,确保前缀正确传递。

方案1:使用进程替换(和你第一条命令类似,但修正参数)

split -C 2M -d -a 3 --filter 'gzip > $FILE.gz' <(unzip -p a.zip) a_

方案2:使用管道(修正参数顺序)

unzip -p a.zip | split -C 2M -d -a 3 --filter 'gzip > $FILE.gz' - a_

这里的-明确告诉split从stdin读取数据,然后a_作为输出文件的前缀。你也可以省略-,因为split默认从stdin读取,所以简化版:

unzip -p a.zip | split -C 2M -d -a 3 --filter 'gzip > $FILE.gz' a_

关键细节解释

  • unzip -p:这个参数专门用于管道场景,它会跳过所有解压提示信息,直接将Zip内的文件内容按顺序输出到stdout,完全符合你“内存中处理、不落地磁盘”的需求。
  • split的参数顺序:当使用管道或进程替换提供输入时,输出前缀必须放在所有选项的最后,否则split会误将前缀当作输入文件路径。
  • --filter 'gzip > $FILE.gz':这个部分是对的,split会自动将生成的分片文件名赋值给$FILE变量,然后通过gzip压缩输出到对应的.gz文件。

这样处理后,就能完美实现将Zip文件在内存中拆分并压缩为多个指定大小的Gzip文件,不会有多余的提示信息混入,也不会报错找不到文件。

内容的提问来源于stack exchange,提问作者Nir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:22:45