递归 UNTAR / 解压缩

递归 UNTAR / 解压缩

我得到 zip 文件或 tar 文件来处理。

zip /tar 文件可能有多个目录和子目录,这些目录和子目录又可能包含 tar 文件 / zip 文件

我需要将父 Tar / Zip 中存在的文件解压到各自的目录位置,然后删除 tar / zip 文件。

以下是我可以实现的目标,但问题是它仅解压/解压父 tar/zip,而不解压 zip/tar 中存在的内容。

found=1

while [ $found -eq 1 ]
do
    found=0
    for compressfile in *.tar *.zip
    do     
        found=1
        echo "EXTRACT THIS:"$compressfile
        tar xvf "$compressfile" && rm -rf "$compressfile"
        unzip "$compressfile" && rm -rf "$compressfile"
        exc=$?

        if [ $exc -ne 0 ]
        then
            exit $exc
        fi
    done
done

注意:Tar 文件可能同时包含 Tar 和 Zip 文件。同样,Zip 可能包含 Zip 或 Tar 文件。

答案1

请注意,这尚未经过测试,但这可能接近您正在寻找的内容:

#!/bin/bash

doExtract() {
    local compressfile="${1}"
    local rc=0

    pushd "$(dirname "${compressfile}")" &> /dev/null
    if [[ "${compressfile}" == *.tar ]]; then
        echo "Extracting TAR: ${compressfile}"
        tar -xvf "$(basename ${compressfile})"
        rc=$?
    elif [[ "${compressfile}" == *.zip ]]; then
        echo "Extracting ZIP: ${compressfile}"
        unzip "$(basename "${compressfile}")"
        rc=$?
    fi
    popd &> /dev/null

    if [[ ${rc} -eq 0 ]]; then
        # You can remove the -i when you're sure this is doing what you want
        rm -i "${compressfile}"
    fi

    return ${rc}
}

found=1

while [[ ${found} -eq 1 ]]; do
    found=0

    for compressfile in $(find . -type f -name '*.tar' -o -name '*.zip'); do
        found=1
        doExtract "${compressfile}"
        rc=$?
        if [[ $rc -ne 0 ]]; then
             exit ${rc}
        fi
    done
done

编辑:此脚本递归查找以.tar或结尾的文件.zip。如果没有 选项-Ctar我使用pushd/popd更改到包含文件的目录,将它们解压到该目录中,然后返回到上一个目录。

相关内容