From a0a9a5b87108c8221af1fc7d6188d8e7bd158dfd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 Nov 2016 14:23:39 +0100 Subject: [PATCH] bin/unarchive: simplify + refactor --- bin/unarchive | 120 ++++++++++++++++++++------------------------------ 1 file changed, 48 insertions(+), 72 deletions(-) diff --git a/bin/unarchive b/bin/unarchive index f1b4224a..74edf1de 100755 --- a/bin/unarchive +++ b/bin/unarchive @@ -1,78 +1,54 @@ -# +#!/usr/bin/env bash + # Extracts the contents of archives. # -# Authors: -# Sorin Ionescu -# - -local remove_archive -local success -local file_name -local extract_dir - -if (( $# == 0 )); then - cat >&2 <. -EOF -fi - -remove_archive=1 -if [[ "$1" == "-r" || "$1" == "--remove" ]]; then - remove_archive=0 - shift -fi +# Adapted from a script by Sorin Ionescu +success= +file_name= +extract_dir= while (( $# > 0 )); do - if [[ ! -s "$1" ]]; then - print "$0: file not valid: $1" >&2 + if [[ ! -s $1 ]]; then + print "$0: file not valid: $1" >&2 + shift + continue + fi + + success=0 + file_name="${1:t}" + extract_dir="${file_name:r}" + case ${1:l} in + *.tar.gz|*.tgz) tar xvzf "$1" ;; + *.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;; + *.tar.xz|*.txz) tar --xz --help &> /dev/null \ + && tar --xz -xvf "$1" \ + || xzcat "$1" | tar xvf - ;; + *.tar.zma|*.tlz) tar --lzma --help &> /dev/null \ + && tar --lzma -xvf "$1" \ + || lzcat "$1" | tar xvf - ;; + *.tar) tar xvf "$1" ;; + *.gz) gunzip "$1" ;; + *.bz2) bunzip2 "$1" ;; + *.xz) unxz "$1" ;; + *.lzma) unlzma "$1" ;; + *.Z) uncompress "$1" ;; + *.zip) unzip "$1" -d $extract_dir ;; + *.rar) unrar &> /dev/null \ + && unrar x -ad "$1" \ + || rar x -ad "$1" ;; + *.7z) 7za x "$1" ;; + *.deb) + mkdir -p "$extract_dir/control" + mkdir -p "$extract_dir/data" + cd "$extract_dir"; ar vx "../${1}" > /dev/null + cd control; tar xzvf ../control.tar.gz + cd ../data; tar xzvf ../data.tar.gz + cd ..; rm *.tar.gz debian-binary + cd .. + ;; + *) print "$0: cannot extract: $1" >&2 + success=1 + ;; + esac shift - continue - fi - - success=0 - file_name="${1:t}" - extract_dir="${file_name:r}" - case "$1:l" in - (*.tar.gz|*.tgz) tar xvzf "$1" ;; - (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;; - (*.tar.xz|*.txz) tar --xz --help &> /dev/null \ - && tar --xz -xvf "$1" \ - || xzcat "$1" | tar xvf - ;; - (*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \ - && tar --lzma -xvf "$1" \ - || lzcat "$1" | tar xvf - ;; - (*.tar) tar xvf "$1" ;; - (*.gz) gunzip "$1" ;; - (*.bz2) bunzip2 "$1" ;; - (*.xz) unxz "$1" ;; - (*.lzma) unlzma "$1" ;; - (*.Z) uncompress "$1" ;; - (*.zip) unzip "$1" -d $extract_dir ;; - (*.rar) unrar &> /dev/null \ - && unrar x -ad "$1" \ - || rar x -ad "$1" ;; - (*.7z) 7za x "$1" ;; - (*.deb) - mkdir -p "$extract_dir/control" - mkdir -p "$extract_dir/data" - cd "$extract_dir"; ar vx "../${1}" > /dev/null - cd control; tar xzvf ../control.tar.gz - cd ../data; tar xzvf ../data.tar.gz - cd ..; rm *.tar.gz debian-binary - cd .. - ;; - (*) - print "$0: cannot extract: $1" >&2 - success=1 - ;; - esac - - (( success = $success > 0 ? $success : $? )) - (( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1" - shift done