#!/usr/bin/env bash # Extracts the contents of archives. # # 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 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 done