X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=usr_bin%2Ffex;h=640111c8fed0f4d21b39df1ef8d85f8a524a30a1;hb=cdb523d5ab869b95f9c33fa0928744adcfb64e2d;hp=330a41260325f23aee2db43fa19914c88edfc031;hpb=e720deae78f1eda5e6f62629606c194f16796762;p=grml-scripts.git diff --git a/usr_bin/fex b/usr_bin/fex index 330a412..640111c 100755 --- a/usr_bin/fex +++ b/usr_bin/fex @@ -1,66 +1,210 @@ #!/bin/zsh # Filename: fex # Purpose: extract archives via smart frontend -# Authors: grml-team (grml.org), (c) Matthias Kopfermann, (c) Michael Prokop +# Authors: grml-team ( grml.org), (c) Matthias Kopfermann, (c) Michael Prokop # 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