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

How to decompress multiple nested archives of different formats?

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

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

但是一旦它偶然发现 .tar 文件,它就不会执行任何操作。我是 运行 mac 上的剧本。
该结构只是一个存档中的一个存档,扩展名没有任何特定顺序,例如:

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

等等

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

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

#! /usr/bin/env bash

# this function can be replaced by `7z x ""`
# if 7zip is installed (package managers often call it p7zip)
extract() {
  case "" in
    *.zip) unzip "" ;;
    *.tar) tar -xf "" ;;
    *) echo "Unknown archive type: "; 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 ..