diff --git a/plugins/available/extract.plugin.bash b/plugins/available/extract.plugin.bash index e357814a..d431e711 100644 --- a/plugins/available/extract.plugin.bash +++ b/plugins/available/extract.plugin.bash @@ -5,7 +5,7 @@ about-plugin 'one command to extract them all...' extract() { local opt local OPTIND=1 - while getopts "hv" opt; do + while getopts "hdv" opt; do case "$opt" in h) cat <&2 + shift + continue + fi + + local -r filename=$(basename -- $1) + local -r filedirname=$(dirname -- $1) + local targetdirname=$(sed 's/\(\.tar\.bz2$\|\.tbz$\|\.tbz2$\|\.tar\.gz$\|\.tgz$\|\.tar$\|\.tar\.xz$\|\.txz$\|\.tar\.Z$\|\.7z$\)//g' <<< $filename) + if [ "$filename" = "$targetdirname" ]; then + # archive type either not supported or it doesn't need dir creation + targetdirname="" + else + mkdir -v "$filedirname/$targetdirname" + fi + + if [ -f "$1" ]; then + case "$1" in + *.tar.bz2|*.tbz|*.tbz2) tar "x${verbose}jf" "$1" -C "$filedirname/$targetdirname" ;; + *.tar.gz|*.tgz) tar "x${verbose}zf" "$1" -C "$filedirname/$targetdirname" ;; + *.tar.xz|*.txz) tar "x${verbose}Jf" "$1" -C "$filedirname/$targetdirname" ;; + *.tar.Z) tar "x${verbose}Zf" "$1" -C "$filedirname/$targetdirname" ;; *.bz2) bunzip2 "$1" ;; *.deb) dpkg-deb -x${verbose} "$1" "${1:0:-4}" ;; *.pax.gz) gunzip "$1"; set -- "$@" "${1:0:-3}" ;; @@ -43,17 +59,15 @@ End-Of-Usage *.pkg) pkgutil --expand "$1" "${1:0:-4}" ;; *.rar) unrar x "$1" ;; *.rpm) rpm2cpio "$1" | cpio -idm${verbose} ;; - *.tar) tar "x${verbose}f" "$1" ;; - *.txz) mv "$1" "${1:0:-4}.tar.xz"; set -- "$@" "${1:0:-4}.tar.xz" ;; + *.tar) tar "x${verbose}f" "$1" -C "$filedirname/$targetdirname" ;; *.xz) xz --decompress "$1" ;; *.zip|*.war|*.jar) unzip "$1" ;; *.Z) uncompress "$1" ;; *.7z) 7za x "$1" ;; *) echo "'$1' cannot be extracted via extract" >&2;; - esac - else - echo "extract: '$1' is not a valid file" >&2 - fi + esac + fi + shift done }