首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归解压缩所有子目录,同时保留文件结构。

递归解压缩所有子目录,同时保留文件结构。
EN

Stack Overflow用户
提问于 2021-11-18 15:30:38
回答 1查看 809关注 0票数 1

我刚开始使用bash脚本,我发现很难解决这个问题。

我有一个父文件夹,包含子目录和压缩子目录的混合。

在这些子目录中也有更多嵌套的zip文件。

不仅有.zip文件,而且还有.rar和.7z文件,它们也包含嵌套的zip/rars/7zs。

我想递归地解压缩、解压缩和un7z所有嵌套的子目录,直到父文件夹不再包含任何.rar、.zip、.7zip文件。(这些最终需要在它们被提取后被移除)。可能有数千个子目录,它们都位于不同的嵌套深度。你可以有压缩文件夹或压缩文件。

但是,我希望保留我的文件夹结构,因此解压缩的文件夹必须保持在已解压缩的位置。

我已经尝试过此脚本,用于解压缩,但它不保留文件结构。

代码语言:javascript
复制
#!/bin/bash

while [ "`find . -type f -name '*.zip' | wc -l`" -gt 0 ]

do
    find . -type f -name "*.zip" -exec unzip -- '{}' \; -exec rm -- '{}' \;
done

我想举个例子:

文件夹'a‘包含压缩文件夹'b.zip’,其中包含压缩文本文件pear.zip (即已压缩到pear.zip a/b.zip(/pear.zip)的pear.txt )

我希望文件夹'a‘包含'b’,包含pear.txt‘a/b/珠光’

上面的脚本将'b‘(b是空的)和pear都放在'a’文件夹中,在那里执行脚本,这不是我想要的。例如'a/b‘和’a/珠光‘

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-18 19:06:17

你可以试试这个:

代码语言:javascript
复制
#!/bin/bash

while :; do
    mapfile -td '' archives \
    < <(find . -type f -name '*.zip' -o -name '*.7z' -print0)

    [[ ${#archives[@]} -eq 0 ]] && break

    for i in "${archives[@]}"; do
        case $i in
            *.zip) unzip -d "$(dirname "$i")" -- "$i";;
            *.7z)  7z x "-o$(dirname "$i")" -- "$i";;
        esac
    done

    rm -rf "${archives[@]}" || break
done

  • 每个归档都由find列出。在正确的位置提取该列表,并删除档案。这会重复,直到找到零档。

  • 您可以添加一个等价的unrar命令(我不熟悉它)。

  • -o -name '*.rar'添加到find,将另一个案例添加到case。如果没有使用cd "$(dirname "$i")" && unrar "$i".

指定目标目录的选项,则可以使用unrar

  • 这个脚本有一些问题。特别是,如果提取失败,存档仍将被删除。否则会导致无限循环。如果解压缩失败,可以使用unzip ... || exit 1退出,并手动处理。

  • 既可以避免删除,也可以通过计数未被删除但希望不需要的文件来避免无限循环。

  • 我无法正确地测试这个。YMMV.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70022554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档