如何在unix/linux中解压包含各种zip级别文件的压缩文件?

如何在unix/linux中解压包含各种zip级别文件的压缩文件?

例如我的文件夹名称是 测试.zip

测试.zip包括各种 zip 文件夹,例如te1.zip、te2.zip、te3.zip 甚至te1.zip包括各种 zip 文件夹。

所以我需要立即在linux中解压。

您能让我知道如何做到这一点吗?

答案1

像这样的简短脚本应该可以完成这项工作(请注意,您需要备份原始文件,因为脚本需要删除它才能递归处理所有内容)。

while [ "$(find . -type f -name '*.zip' | wc -l)" -gt 0 ]; 
  do 
    find -type f -name '*.zip' -exec mkdir '{}'_dir \; \ 
                               -exec unzip -d '{}'_dir -- '{}' \; \
                               -exec rm -- '{}' \;
  done

-delete在某些系统上,可能可以使用-exec rm -- '{}' \;.

  • 该命令将遍历您当前的目录(期望这是一个空目录,其中只有 Test.zip(或您拥有的任何 zip 文件)可用)。
  • 对于每个找到的存档,它将创建一个存档名称 + _dir 的新目录(如果某些存档包含具有匹配名称的文件,则可以避免冲突)。
  • 它将把存档解压到新创建的目录并删除已处理的 zip 文件
  • 处理完所有文件后,它将再次迭代并检查 zip 文件在目录树中是否仍然可用
  • 请注意,如果内部某处存在 zip 炸弹,脚本将陷入无限循环。

答案2

这是递归脚本的绝佳候选者。

将其另存为脚本(例如my_unzip.sh如果按原样粘贴到命令行将不起作用

#!/usr/bin/env bash

: ${1:?Please supply a file} # ${1} is the zip being fed to the script -- a little user-friendliness never went amiss
DIR="${1%.zip}" # this is where the current zip will be unzipped
mkdir -p "${DIR}" || exit 1 # might fail if it's a file already
unzip -n -d "${DIR}" "${1}" # unzip current zip to target directory
find "${DIR}" -type f -name '*.zip' -print0 | xargs -0 -n1 "${0}" # scan the target directory for more zips and recursively call this script (via ${0})

使其可执行

chmod +x my_unzip.sh

并使用您的 zip 文件作为参数运行它:

my_unzip.sh /some/path/yourfile.zip

保留您的原始文件,内联注释以解释发生的情况。

懦弱的是,它从不试图覆盖已经存在的东西。可以通过更新unzip命令来更改此行为以删除-n,以获取提示,或将其更改为-o以强制覆盖。

相关内容