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

问题描述

我有数百个以未知深度相互嵌套的 .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...

等等

解决方法

您可以使用诸如 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 ..