【问题标题】: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/... 还是一个存档包含(嵌套)目录、其他文件,甚至是多个存档?

标签: bash macos compression archive


【解决方案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 ..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2021-06-01
    • 2022-12-21
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多