如何解压多个不同格式的嵌套存档?

Posted

技术标签:

【中文标题】如何解压多个不同格式的嵌套存档?【英文标题】:How to decompress multiple nested archives of different formats? 【发布时间】:2021-04-28 11:42:08 【问题描述】:

我有数百个相互嵌套的 .zip 和 .tar 档案,深度未知,我需要将它们全部解压到最后一个,我该如何实现呢? 我有 zip 文件的部分:

while 'true' 
do
find . '(' -iname '*.zip' ')' -exec sh -c 'unzip -o -d "$0%.*" "$0"' '' ';'
done

但是一旦它偶然发现了 .tar 文件,它预计什么都不做。我在mac上运行脚本。 该结构只是档案中的档案,扩展名没有任何特定的顺序,例如:

a.zip/b.zip/c.tar/d.tar/e.zip/f.tar...

等等

【问题讨论】:

如果您安装了 7zip,您可以使用 7z x -- 提取 tar 或 zip 文件。 @Socowi - 我不认为 mac 有 7zip 您的问题没有提到它在 Mac 上运行的要求。 edit 解决这个问题的问题。 @DanMašek 完成! 7zip 在 mac 上可用,甚至在 homebrew 中。 +++ 如果你想要一个实际的答案(有或没有 7zip),请显示你的档案结构。只是a.zip/b.tar/c.zip/... 还是一个存档包含(嵌套)目录、其他文件,甚至是多个存档? 【参考方案1】:

您可以使用7z x 等现有命令来提取存档类型或使用case "$file" in; *.zip) unzip ...;; *.tar) ... 构建自己的存档类型等等。

只要解压的内容恰好是一个.tar.zip 存档,以下脚本就会解压嵌套存档。当多个档案、多个文件,甚至只包含一个.zip 的目录被一次解压时,它就会停止。

#! /usr/bin/env bash

# this function can be replaced by `7z x "$1"`
# if 7zip is installed (package managers often call it p7zip)
extract() 
  case "$1" in
    *.zip) unzip "$1" ;;
    *.tar) tar -xf "$1" ;;
    *) echo "Unknown archive type: $1"; exit 1 ;;
  esac

isOne() 
  [ $# = 1 ]


mkdir out tmp
ln ,out/yourOutermostArchive.zip # <-- Adapt this line
cd out
shopt -s nullglob
while isOne * && isOne *.zip,tar
do
  a=(*)
  mv "$a" ../tmp/
  extract "../tmp/$a"
  rm "../tmp/$a"
done
rm -r ../tmp
cd ..

【讨论】:

以上是关于如何解压多个不同格式的嵌套存档?的主要内容,如果未能解决你的问题,请参考以下文章

如何解压其中只有一个目录的存档并将其重命名为常量名称

如何将一个Java项目打包打成多个Jar包

具有不同 http 请求的存档主详细信息概念

Linux解压命令(tar)

如何格式化嵌套的多值绑定?

如何在java中找到拆分的存档?