Linux下无需解压原Zip,按模式提取文件到新Zip的方法
无需解压org.zip,直接提取匹配**/bin/*.o的文件到new.zip
有没有办法不用解压org.zip,直接把其中所有匹配**/bin/*.o模式的文件“复制”到new.zip中?
org.zip的内容:
$ unzip -l org.zip Archive: org.zip Length Date Time Name --------- ---------- ----- ---- 0 04-24-2023 20:13 org/ 8 04-24-2023 20:06 org/c.c 0 04-24-2023 20:00 org/bin/ 12 04-24-2023 20:02 org/bin/a.o <- wanted 12 04-24-2023 20:05 org/bin/b.o <- wanted 12 04-24-2023 20:03 org/bin/c.o. <- wanted 8 04-24-2023 20:06 org/a.c 8 04-24-2023 20:06 org/b.c 0 04-24-2023 19:59 org/debug/ 14 04-24-2023 20:03 org/debug/a.o 14 04-24-2023 20:03 org/debug/b.o 14 04-24-2023 20:03 org/debug/c.o --------- ------- 102 12 files # 目标文件列表 $ unzip -Z1 org.zip "**/bin/*.o" org/bin/a.o org/bin/b.o org/bin/c.o
当前临时目录解法:
$ unzip -q -o org.zip '**/bin/*.o' -d ./tmp $ ( cd ./tmp && zip -q -r - . ) > new.zip $ rm -rf ./tmp # 验证结果 $ unzip -l new.zip Archive: new.zip Length Date Time Name --------- ---------- ----- ---- 0 04-24-2023 20:20 org/ 0 04-24-2023 20:20 org/bin/ 12 04-24-2023 20:02 org/bin/a.o 12 04-24-2023 20:05 org/bin/b.o 12 04-24-2023 20:03 org/bin/c.o --------- ------- 36 5 files
更优雅的流式处理方案
方案1:用bsdtar直接处理(推荐)
bsdtar支持跨压缩包直接筛选打包,全程无临时文件,命令简洁高效:
bsdtar -cf new.zip -f org.zip '*/bin/*.o'
执行后直接生成包含目标文件的new.zip,路径结构和原压缩包完全一致。
方案2:结合unzip和zip实现流式处理
如果只能用unzip和zip工具,可以用以下命令:
unzip -Z1 org.zip "**/bin/*.o" | xargs -I {} sh -c "unzip -p org.zip {} | zip new.zip --name {}"
unzip -Z1先列出所有匹配的文件路径- 每个路径通过xargs传递给子shell,用
unzip -p输出文件内容 - 最后用
zip --name指定归档内的路径,把内容写入new.zip
这个方法虽然会为每个文件单独调用zip,但不需要临时目录,实现了流式处理的需求。
内容的提问来源于stack exchange,提问作者Marslo
相关产品推荐
相关产品推荐

