如何在内存中将Zip文件拆分为多个Gzip文件?命令执行报错问题咨询
解决Zip文件内存内拆分压缩为多个Gzip文件的问题
我来帮你梳理下问题并给出可行的方案:
问题分析
- 第一条命令的问题:
unzip a.zip默认会将文件解压到磁盘,同时把解压提示(比如Archive: a.zip inflating: data.txt)输出到stdout,而不是文件内容。就算你用-c参数,unzip还是会输出归档信息和文件名提示,这些都会被split捕获并压缩,导致结果不符合预期。 - 第二条命令的问题:
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
相关产品推荐
相关产品推荐

