私は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を使用してください。tgz
zip
iso
bsdtar -xf "$any_archive"
p
( //関連する権限、所有権、スパース処理などの他のオプションも参照してください)。o
S
bsdcat
またはほとんどの圧縮形式(gz
、、、 )をxz
解凍bz2
するためのlibarchive
bsdcat -- "$compressed_file" > "$uncompressed_file"
これはzip
単純な圧縮形式ではなくアーカイブ形式であることに注意してください。zip
プロファイルには複数のメンバーが含まれることがよくあります。bsdcat
それらだけをつなげます。代わりにbsdtar
それを抽出するために使用してください。