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