Update soundtest
[grml-scripts.git] / usr_bin / fex
index 330a412..640111c 100755 (executable)
 #!/bin/zsh
 # Filename:      fex
 # Purpose:       extract archives via smart frontend
-# Authors:       grml-team (grml.org), (c) Matthias Kopfermann, (c) Michael Prokop <mika@grml.org>
+# Authors:       grml-team ( grml.org), (c) Matthias Kopfermann, (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Sam Mai 27 15:12:16 CEST 2006 [mika]
+# Latest change: Sam Nov 25 21:37:22 CET 2006 [mika]
 ################################################################################
 
+zmodload zsh/files
 autoload -U colors && colors
 emulate zsh
 
+FILENAME=$0
+ARGV=$1
+alarmcol=$fg_bold[red]
+defcol=$fg[default]$bg[default]
+col1=$fg_bold[green]
+col2=$fg_bold[magenta]
+col3=$fg_bold[cyan]
+col4=$fg[cyan]
+
+usage() { print "Usage: $FILENAME file_to_extract" && exit  ; }
+ (( $ARGC != 1 )) && usage
+ [[ $ARGV == "-h" || $ARGV == "--help" ]] && usage
  file=$1
- qprompt="
-        $fg_bold[red]Really decompress $fg_bold[magenta]${file}$fg[default]? Press y or Y for YES
-        or any other key for NO $fg[default]
-"
+ FILEPRG=$( which file )
+ [[ $( tar --version 3>&1 ) != *(GNU|star)* ]] && echo "sorry, GNU tar or star is needed" && exit
+ test -z $FILEPRG && echo $0 needs a program named file to detect the filetype && exit
 
- nothing_to_do="
-        $fg_bold[green]Okay, I will not uncompress the file $fg_bold[magenta]${file}$fg[default]$fg[default] as requested.
+qprompt="
+        Really decompress $alarmcol${file}$defcol? Press y or Y for YES
+        or any other key for NO $defcol
 "
 
+nothing_to_do="
+        ${col1}Okay, I will not uncompress the file $col2${file}$defcol as requested.
+"
 decision="read -q '?$qprompt'"
-(( ${+PAGER} )) || local PAGER=less
 
- if [ -f $file ]
+local -A filetype; filetype=(\
+        bz2cpio "cpio archive *bzip2*"
+        cpiogz  "cpio archive *gzip*"
+        tarbz2  "*tar archive*bzip2*"
+        targz   "*tar archive*gzip*"
+        tarz    "*POSIX tar archive \(compress\'d data 16 bits\)*"
+        bz2     "*\(bzip2 compressed data*"
+        tar     "*tar*"
+        gz      "*gzip*"
+        7zip    "*7-zip archive data*"
+        arj     "ARJ archive data*"
+        zip     "*Zip archive data*"
+        Z       "*compress'd data 16 bits*"
+        deb     "Debian binary package*"
+        uu      "*uuencoded*xxencoded*"
+        lzo     "lzop compressed data - *"
+        cpio    "cpio archive"
+        rar     "RAR archive data*"
+        cab     "CAB file"
+        #rpm    "$file: *RPM*"
+)
+
+tarlist='/usr/bin/env tar -tvf'                 ; tarextract='/usr/bin/env tar -C $whereto -xvf'
+tarbz2list='/usr/bin/env tar -tvjf'             ; tarbz2extract='/usr/bin/env tar -C ${whereto:-$PWD} -xvjf'
+targzlist='/usr/bin/env tar -tvzf'              ; targzextract='/usr/bin/env tar -C $whereto -xvzf'
+gzlist='/usr/bin/env gzip -lv'                  ; gzextract='/usr/bin/env gzip -dc'
+tarzlist='/usr/bin/env tar -tvZf'               ; tarzextract='/usr/bin/env tar -C $whereto -xvZf'
+tarcompresslist='/usr/bin/env tar -tvZf'        ; tarcompressextract='/usr/bin/env tar -$ whereto -xvZf'
+#cpiobz2list='bzip2 -cd $file | cpio -ivt'; cpiobz2extract='bzip2 -cd $CWD/$file  | cpio -idv'
+#cpiogzlist='gzip -cd $file | cpio -tv'
+#cpiogzextract='gzip -cd $file | cpio -ivd'
+cpiogz='/usr/bin/env star tzvf'                 ; cpiogzextract='/usr/bin/env star xzvf'
+_7ziplist='/usr/bin/env 7zr l'                  ; _7zipextract='/usr/bin/env 7zr e -o$whereto'
+arjlist='/usr/bin/env arj l'                    ; arjextract='/usr/bin/env arj e -e $CWD/$file'
+compresslist='/usr/bin/env uncompress -l'       ; compressextract='/usr/bin/env uncompress -cv'
+lhalist='/usr/bin/env lha -l'                   ; lhaextract='/usr/bin/env lha -xw=$whereto'
+deblist='/usr/bin/env dpkg-deb -c'              ; debextract='/usr/bin/env dpkg -X'
+lzolist='/usr/bin/env lzop -l'                  ; lzoextract='/usr/bin/env lzop -dN -p$whereto'
+cpiolist='/usr/bin/env cpio -t'                 ; cpioextract='/usr/bin/env cpio -idv'
+rarlist='/usr/bin/env unrar lb'                 ; rarextract='/usr/bin/env unrar e'
+cablist='/usr/bin/env cabextract -l'            ; cabextract='/usr/bin/env cabextract -d $whereto'
+#rpmlist='/usr/bin/env rpm2cpio  #rpmextract=
+ziplist='/usr/bin/env unzip -l'                 ; zipextract='/usr/bin/env unzip -d $whereto'
+
+
+# ------------------------------------------------- functions
+put_there() {
+        vared -p "
+        ${col2}Where should I extract to?
+        ${col4}( Non existing directories will be created,
+        completion works as do usual editing commands )$defcol
+        " whereto  && test -d $whereto \
+        || builtin mkdir -p $whereto
+}
+# -------------------------------------------end of functions
+
+((  ${+PAGER} )) || local PAGER=less
+
+
+ if [[ -f $file ]]
  then
-         case $file in
-         (*.tar.bz2) 
-                tar -tvjf $file \
-                       | \
-                     $PAGER && eval $decision && tar -xvjf $file \
+        filetest=$( $FILEPRG -bz $file )
+        echo "This is a $col2$filetest$defcol"
+        sleep 1
+ whereto=$PWD
+         case "$filetest" in
+          ( ${~filetype[bz2cpio]} )
+                $=cpiobz2list  |&  $PAGER && eval $decision \
+                && put_there \
+                && CWD=$PWD \
+                && ( cd $whereto &&  print "${col1}extracting to $whereto$defcol" && ${(e)=cpiobz2extract}  ) \
+                || print $nothing_to_do ;;
+         ( ${~filetype[cpiogz]} )
+                ${(e)=cpiogzlist}  |  $PAGER && eval $decision \
+                && put_there \
+                && CWD=$PWD \
+                && ( cd $whereto &&  print "${col1}extracting to $whereto$defcol" && ${(e)=cpiogzextract}  ) \
+                || print $nothing_to_do ;;
+         ( ${~filetype[tarbz2]} )
+                $=tarbz2list $file \
+                       |
+                     $PAGER && eval $decision && put_there \
+                     && ${(e)=tarbz2extract} $file \
                       || print $nothing_to_do ;;
-         (*.tar.gz)
-                tar -tvzf $file  | $PAGER && eval $decision \
-                && tar -xvzf $file \
+         ( ${~filetype[targz]} )
+                $=targzlist $file  | $PAGER && eval $decision \
+                && put_there \
+                && ${(e)=targzextract} $file \
+                || print $nothing_to_do ;;
+         ( ${~filetype[tarz]} )
+                $=tarzlist $file  | $PAGER && eval $decision \
+                && put_there \
+                && print "${col3}extracting to $whereto:$defcol" \
+                && ${(e)=tarzextract} $file \
                 || print $nothing_to_do ;;
-         (*.bz2)
+         ( ${~filetype[bz2]} )
                 bzip2 -tv $file  | $PAGER && eval $decision \
-                && bzip2 -vd $file || print $nothing_to_do ;;
-         (*.gz)
-                gzip -tv  $file | $PAGER && eval $decision \
-                && gzip -d $file || print $nothing_to_do ;;
-         (*.tar)
-                tar -tvf $file | $PAGER && eval $decision \
-                && tar xvf $file || print $nothing_to_do ;;
-         (*.tgz)
-                tar -tvzf $file | $PAGER&& eval $decision \
-                && tar xzvf $file || print $nothing_to_do ;;
-         (*.zip)
-                unzip -tv $file | $PAGER&& eval $decision \
-                && unzip $file || print $nothing_to_do ;;
-         (*.Z)
-                uncompress -tv $file | $PAGER && eval $decision \
-                && uncompress -v $file || print $nothing_to_do ;;
-         (*.rar)
-                unrar t $file | $PAGER && eval $decision \
-                && unrar x $file || print $nothing_to_do ;; 
-         (*.lzo)
-                lzop -t $file | $PAGER && eval $decision \
-                && lzop -x $file || print $nothing_to_do ;;
-         (*)
-                echo 'Error. Not the expected arguments!'
+                && put_there \
+                && bzip2 -dc $file > $whereto/${file:t:r} \
+                && print "extracting to $whereto/${file:t:r}" || print $nothing_to_do ;;
+         ( ${~filetype[gz]} )
+                $=gziplist  $file | $PAGER && eval $decision \
+                && put_there \
+                && dest="$whereto/${file:t:r}" \
+                && gzip -dc $file > $dest && print "extracting to $dest" || print $nothing_to_do ;;
+         ( ${~filetype[tar]} )
+                $=tarlist $file | $PAGER && eval $decision \
+                && put_there \
+                && ${(e)=tarextract} $file || print $nothing_to_do ;; #ok
+         ( ${~filetype[7zip]} )
+                $=_7ziplist $file | $PAGER && eval $decision \
+                && put_there \
+                && ${(e)=_7zipextract} $file || print $nothing_to_do ;; # -o cannot stand a space, attention! #ok
+         ( ${~filetype[arj]} )
+                $=arjlist $file | $PAGER && eval $decision \
+                && put_there \
+                && CWD=$PWD \
+                && ( cd $whereto && arj e -e $CWD/$file ) || print $nothing_to_do ;;
+         ( ${~filetype[zip]} )
+                ${=ziplist} $file | $PAGER && eval $decision \
+                && put_there \
+                && ${(e)=zipextract} $file || print $nothing_to_do ;; #ok
+         ( ${~filetype[Z]} )
+                $=compresslist $file | $PAGER && eval $decision \
+                && put_there \
+                && dest="$whereto/${file:t:r}" \
+                && ${(e)=compressextract} $file > $dest && print "extracting to $dest" || print $nothing_to_do ;; #ok
+         ( ${~filetype[lha]} )
+                $=lhalist $file   | $PAGER && eval $decision \
+                && put_there \
+                && ${(e)=lhaextract} $file || print $nothing_to_do ;; #ok
+         ( ${~filetype[rar]} )
+                 $=rarlist $file | $PAGER && eval $decision \
+                && put_there \
+                && CWD=$PWD \
+                && (cd $whereto && ${(e)=rarextract} $CWD/$file ) || print $nothing_to_do ;;  #ok
+         ( ${~filetype[lzo]} )
+                $=lzolist $file | $PAGER && eval $decision \
+                && put_there \
+                && ${(e)=lzoextract} $file || print $nothing_to_do ;; #ok
+         ( ${~filetype[cpio]} )
+                $=cpiolist < $file | $PAGER && eval $decision \
+                && put_there \
+                && CWD=$PWD \
+                && ( cd $whereto &&  ${(e)=cpioextract} < $CWD/$file ) || print $nothing_to_do ;; #ok
+         ( ${~filetype[deb]} )
+                ${(e)=deblist} $file | $PAGER && eval $decision \
+                && put_there \
+                && ${(e)=debextract} $file $whereto || print $nothing_to_do ;; #ok
+         ( ${~filetype[uu]} )
+                put_there \
+                && CWD=$PWD \
+                && ( cd $whereto && uudecode $CWD/$file ) || print $nothing_to_do ;;
+         ( ${~filetype[cab]} )
+                $=cablist $file | $PAGER && eval $decision \
+                put_there \
+                &&  ${(e)=cabextract} $file || print $nothing_to_do ;;
+        #( ${~filetype[rpm]} )
+        #       temp=$( dd if=/dev/urandom bs=1 count=30 2>/dev/null | uuencode - | tr -d '[[:punct:]]' | sed '2!d' )
+        #       temp=${(C)${${${(f)"$(dd if=/dev/urandom bs=1 count=20 2>/dev/null | uuencode - 2>/dev/null)"}[2]}//[[:punct:]]}}
+        # (cd $temp &&  rpm2cpio $file && CPIO=*.cpio && cpio -ivt < $CPIO )\
+        #       put_there \
+        #
+        #       && ( cd $whereto && cpio -ivd < $temp/$file ) || print $nothing_to_do
+        #       rm -r $temp ;;
+         ( * )
+                echo "${alarmcol}Error. Not the expected arguments or other problem!$defcol"
                 echo "Usage: $0 file" ; exit 1 ;;
          esac
  else