#!/bin/bash

# Skrypt zcat / zmore / zgrep, który można powiązać za pomocą linków symbolicznych
# z odpowiednimi poleceniami. Pozwala użytkownikowi w transparentny
# sposób pracować ze skompresowanymi plikami.

Z="compress";  unZ="uncompress"  ;  Zlist=""
gz="gzip"    ; ungz="gunzip"      ; gzlist=""
bz="bzip2"   ; unbz="bunzip2"     ; bzlist=""

# Pierwszym krokiem jest wyodrębnienie nazw plików. Odbywa się to poprzez
# przeglądanie wszystkich argumentów i sprawdzanie, czy zawierają nazwy plików.
# Jeżeli jest to nazwa zawierająca sufiks opisujący kompresję, wtedy plik jest
# dekompresowany, i po zmianie nazwy przetwarzany. Na koniec z powrotem
# kompresowane są wszystkie pliki.

for arg
do 
  if [ -f "$arg" ] ; then
    case "$arg" in
       *.Z) $unZ "$arg"
            arg="$(echo $arg | sed 's/\.Z$//')"
            Zlist="$Zlist \"$arg\""
            ;;

      *.gz) $ungz "$arg"
            arg="$(echo $arg | sed 's/\.gz$//')"
            gzlist="$gzlist \"$arg\""
            ;;

     *.bz2) $unbz "$arg"
            arg="$(echo $arg | sed 's/\.bz2$//')"
            bzlist="$bzlist \"$arg\""
            ;;

    esac
  fi
  newargs="${newargs:-""} \"$arg\""
done

case $0 in
  *zcat*  ) eval  cat $newargs                  ;;
  *zmore* ) eval more $newargs                  ;;
  *zgrep* ) eval grep $newargs                  ;;
      *   ) echo "$0: nieznane polecenie. Operacja przerwana." >&2; exit 1
esac

# Dekompresja wszystkich plików.

if [ ! -z "$Zlist"  ] ; then
  eval $Z $Zlist
fi
if [ ! -z "$gzlist"] ; then
  eval $gz $gzlist
fi
if [ ! -z "$bzlist" ] ; then
  eval $bz $bzlist 
fi

# and done

exit 0
