#!/bin/bash
# Skrypt bestcompress kompresujący zadany plik za pomocą
# trzech dostępnych poleceń, zachowujący najmniejszy
# uzyskany plik i wyświetlający odpowiedni komunikat. Skrypt
# wywołany bez argumentu -a pomija wszystkie skompresowane pliki
# podane w pozostałych argumentach.

Z="compress"     gz="gzip"     bz="bzip2"
Zout="/tmp/bestcompress.$$.Z"
gzout="/tmp/bestcompress.$$.gz"
bzout="/tmp/bestcompress.$$.bz"
skipcompressed=1

if [ "$1" = "-a" ] ; then
  skipcompressed=0  ; shift
fi

if [ $# -eq 0 ]; then
  echo "Użycie: $0 [-a] plik lub pliki przeznaczone do skompresowania" >&2; exit 1
fi

trap "/bin/rm -f $Zout $gzout $bzout" EXIT

for name in "$@"
do 
  if [ ! -f "$name" ] ; then 
    echo "$0: plik $name nie istnieje. Operacja przerwana." >&2
    continue
  fi

  if [ "$(echo $name | egrep '(\.Z$|\.gz$|\.bz2$)')" != "" ] ; then
    if [ $skipcompressed -eq 1 ] ; then
      echo "Plik ${name} pominięty, ponieważ jest już skompresowany." 
      continue
    else
      echo "Uwaga, plik $name będzie ponownie skompresowany." 
    fi
  fi

# Próba jednoczesnego skompresowania pliku trzema metodami.
  $Z  < "$name" > $Zout  &
  $gz < "$name" > $gzout &
  $bz < "$name" > $bzout &
  
  wait  # Oczekiwanie, aż kompresja zakończy się.

# Sprawdzenie, który plik jest najlepiej skompresowany.
  smallest="$(ls -l "$name" $Zout $gzout $bzout | \
     awk '{print $5"="NR}' | sort -n | cut -d= -f2 | head -1)"

  case "$smallest" in
     1 ) echo "Kompresja pliku $name nie spowodowała jego pomniejszenia."
         "Plik pozostawiony bez zmian."
         ;;
     2 ) echo Najlepiej kompresuje polecenie compress. Nowa nazwa pliku: ${name}.Z
         mv $Zout "${name}.Z" ; rm -f "$name"
         ;;
     3 ) echo Najlepiej kompresuje polecenie gzip. Nowa nazwa pliku: ${name}.gz
         mv $gzout "${name}.gz" ; rm -f "$name"
         ;;
     4 ) echo Najlepiej kompresuje polecenie bzip2. Nowa nazwa pliku: ${name}.bz2
         mv $bzout "${name}.bz2" ; rm -f "$name"
  esac

done

exit 0
