例如我的文件夹名称是 测试.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
以强制覆盖。