ファイルコマンドに基づいてアーカイブを解凍する方法

ファイルコマンドに基づいてアーカイブを解凍する方法

私はbashスクリプトに初めて触れました。

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、圧縮、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、圧縮、bzip2、txtを割り当ててから、ケースの説明に従ってこれらのパターンを一致させる必要があります。

./unpack.sh archive.zipを試しても、残念ながら何も起こりません。

助けてくれてありがとう!

答え1

努力する:

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

その後、XZ、gzipなど、またはそれが生成するすべてをテストできます。

答え2

bsdtarほとんどのアーカイブ形式(tar、、、、s ...)を独自に抽出できるlibarchiveを使用してください。tgzzipiso

bsdtar -xf "$any_archive"

p( //関連する権限、所有権、スパース処理などの他のオプションも参照してください)。oS

bsdcatまたはほとんどの圧縮形式(gz、、、 )をxz解凍bz2するためのlibarchive

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

これはzip単純な圧縮形式ではなくアーカイブ形式であることに注意してください。zipプロファイルには複数のメンバーが含まれることがよくあります。bsdcatそれらだけをつなげます。代わりにbsdtarそれを抽出するために使用してください。

関連情報