如何根据 file 命令解压缩存档

如何根据 file 命令解压缩存档

我对 bash 脚本很陌生,我想编写一个名为 unpack 的脚本,如下所示:

unpack [-r] [-v] file [file...]
-v - verbose
-r - recursive - will traverse contents of folders recursively, performing unpack on each.

我需要确定使用了哪种压缩,并对这些压缩类型执行解包。

假设文件名和扩展名没有任何意义 - 了解使用什么方法的唯一方法是通过 file 命令。我有4个解压选项gunzip、bunzip2、unzip、uncompress

所以我写了一个名为execute_unpacking的函数

#!/bin/bash

exectute_unpacking(){

    for FILE in "${@}"
    do
        local FILE_TYPE=$(file "${FILE}")

        # How to get the compression type of the file?

        case "${FILE_TYPE}" in
            *bzip2) bunzip2 ${RECURSIVE} "${FILE}" ;;
            *gzip) gunzip ${RECURSIVE} "${FILE}" ;;
            *Zip) unzip ${RECURSIVE} ${FILE} ;;
            *compress) uncomprees ${RECURSIVE} ${FILE} ;;
            ?) echo "${FILE} cannot be extarcted" ;;
        esac

    done
}

因此,基于 $(file ${FILE}) 我需要检查 Zip、bzip2、compress、gzip

这是正确的方法吗? (我不想使用像 dtrx 这样的外部工具)

例如,如果我有 4 个文件:

$(file -i archive) => archive: text/plain; charset=us-ascii
$(file -i archive.bz2) => archive.bz2: application/x-bzip2; charset=binary
$(file -i archvive.gz) =>archive.gz: application/x-gzip; charset=binary
$(file -i archive.cmpr) => archive.cmpr: application/x-compress; charset=binary

所以我需要分配给 FILE_TYPE 变量 4 个选项 gzip、compress、bzip2、txt,然后在我的 case 语句中相应地匹配这些模式

当我尝试 ./unpack.sh archive.zip 时,不幸的是没有发生任何事情。

在此先感谢您的帮助!

答案1

尝试:

local file_type=$(file -b "${FILE}" | awk '{print $1}')

然后您可以测试 XZ、gzip 等或它生成的任何内容。

答案2

只需使用 libarchive ,它可以自行bsdtar提取大多数存档格式(tar, tgz, zip, s...):iso

bsdtar -xf "$any_archive"

(另请参阅其他选项,例如p//处理相关的权限、所有权、稀疏性)。oS

或 libarchivebsdcat来解压缩大多数压缩格式 ( gz, xz, bz2)

bsdcat -- "$compressed_file" > "$uncompressed_file"

请注意,这zip是一种存档格式,而不仅仅是一种压缩格式。zip档案通常包含多个成员。bsdcat只会将它们连接起来。而是使用bsdtar它来提取它们。

相关内容