#!/bin/sh
# bestcompress - tant donn un fichier, tente de le compacter avec tous
#   les outils de compactage disponibles et retient le meilleur rsultat,
#   tout en rapportant toute erreur produite  l'utilisateur. En l'absence
#   de l'option -a, bestcompress ignore les fichiers dj compacts.

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

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

if [ $# -eq 0 ] ; then 
  echo "Syntaxe: $0 [-a] <fichier(s)  compacter de manire optimale>" >&2; exit 1 
fi

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

for name 
do
  if [ ! -f "$name" ] ; then
    echo "$0: fichier $name introuvable. Je l'ignore." >&2
    continue
  fi

  if [ "$(echo $name | egrep '(\.Z$|\.gz$|\.bz2$)')" != "" ] ; then
    if [ $skipcompressed -eq 1 ] ; then
      echo "Je saute le fichier ${name}: il est dj compact."
      continue
    else
      echo "Avertissement: je tente de compacter $name une deuxime fois."
    fi
  fi

  $Z  < "$name" > $Zout  &
  $gz < "$name" > $gzout &
  $bz < "$name" > $bzout &

  wait # excute les compactages en parallle pour gagner en vitesse.
       # On attend que tous soient termins.

  # on excute les commandes ls une  une sinon les fichiers sont
  #   rordonns par ordre alphabtique
  smallest="$((ls -l "$name"; ls -l "$Zout"; ls -l "$gzout"; ls -l "$bzout") | \
    awk '{print $5"="NR}' | sort -n | cut -d= -f2 | head -1)"

  case "$smallest" in
    1 ) echo "On n'a rien gagn en compactant $name. On le laisse tel quel."
        ;;

    2 ) echo Le meilleur compactage est obtenu par compress. 
        echo Le fichier s\'appelle dsormais ${name}.Z 
        mv $Zout "${name}.Z" ; rm -f "$name" 
        ;;

    3 ) echo Le meilleur compactage est obtenu par gzip. 
        echo Le fichier s\'appelle dsormais ${name}.gz 
        mv $gzout "${name}.gz" ; rm -f "$name" 
        ;;

    4 ) echo Le meilleur compactage est obtenu par bzip2. 
        echo Le fichier s\'appelle dsormais ${name}.bz2 
        mv $bzout "${name}.bz2" ; rm -f "$name" 
  esac

done

exit 0
