如何解压多个不同格式的嵌套存档?
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 ..
【讨论】:
以上是关于如何解压多个不同格式的嵌套存档?的主要内容,如果未能解决你的问题,请参考以下文章