extract() { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xjf $1 ;; *.tar.gz) tar xzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar e $1 ;; *.gz) gunzip $1 ;; *.tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *) echo "'$1' cannot be extracted via extract()" ;; esac else echo "'$1' is not a valid file" fi } #! /usr/bin/env bash declare -A EXTENSION_DICT=( [tar.xz]="kxJf" [txz]="kxJf" [tar.bz2]="kxjf" [tar.bz]="kxjf" [tar.gz]="kxzf" [tgz]="kxzf" [tbz]="kxjf" [tbz2]="kxjf" [tb2]="kxjf" ) function extract_archive(){ read file extension <<<$(echo $1 $2) echo "extracting $file to ${file%$extension}" eval "tar ${EXTENSION_DICT[$extension]} $file" } for file in $* do case "$file" in *tar.xz) extract_archive $file "tar.xz" ;; *tar.bz2) extract_archive $file "tar.bz2" ;; *tar.bz) extract_archive $file "tar.bz" ;; *tar.gz) extract_archive $file "tar.gz" ;; *tgz) extract_archive $file "tgz" ;; *tbz) extract_archive $file "tbz" ;; *tbz2) extract_archive $file "tbz2" ;; *tb2) extract_archive $file "tb2" ;; *txz) extract_archive $file "txz" ;; *) echo "Sorry, unrecognized file format." exit 1 ;; esac done