home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / usr / bin / bznew < prev    next >
Text File  |  2006-11-29  |  4KB  |  152 lines

  1. #!/bin/sh
  2.  
  3. PATH="/usr/bin:$PATH"; export PATH
  4. check=0
  5. pipe=0
  6. opt=
  7. files=
  8. keep=0
  9. res=0
  10. old=0
  11. new=0
  12. block=1024
  13. # block is the disk block size (best guess, need not be exact)
  14.  
  15. warn="(does not preserve modes and timestamp)"
  16. tmp=`mktemp -d ${TMPDIR-/tmp}/zfoo.XXXXXX` || {
  17.        echo 'cannot create temporary directory' >&2
  18.        exit 1
  19. }
  20. trap "rm -rf $tmp/" 0 1 2 3 6 13 15
  21. set -C
  22. echo hi > $tmp/1
  23. echo hi > $tmp/2
  24. if test -z "`(${CPMOD-cpmod} $tmp/1 $tmp/2) 2>&1`"; then
  25.   cpmod=${CPMOD-cpmod}
  26.   warn=""
  27. fi
  28.  
  29. if test -z "$cpmod" && ${TOUCH-touch} -r $tmp/1 $tmp/2 2>/dev/null; then
  30.   cpmod="${TOUCH-touch}"
  31.   cpmodarg="-r"
  32.   warn="(does not preserve file modes)"
  33. fi
  34.  
  35. # check about bzip extension
  36. bzip2 $tmp/1 &> /dev/null
  37. ext=`echo $tmp/1* | sed "s|$tmp/1||"`
  38. rm -rf $tmp/
  39. trap - 0 1 2 3 6 13 15
  40. if test -z "$ext"; then
  41.   echo bznew: error determining bzip2 extension
  42.   exit 1
  43. fi
  44. if test "$ext" = ".gz"; then
  45.   echo bznew: cannot use .gz as bzip extension.
  46.   exit 1
  47. fi
  48.  
  49. for arg
  50. do
  51.   case "$arg" in
  52.   -*)     opt="$opt $arg"; shift;;
  53.    *)     break;;
  54.   esac
  55. done
  56.  
  57. if test $# -eq 0; then
  58.   echo "recompress .gz files into $ext (bzip) files"
  59.   echo usage: `echo $0 | sed 's,^.*/,,'` "[-tv9KP]" file.gz...
  60.   echo "  -t tests the new files before deleting originals"
  61.   echo "  -v be verbose"
  62.   echo "  -9 use the slowest compression method (optimal compression)"
  63.   echo "  -K keep a .gz file when it is smaller than the $ext file"
  64.   echo "  -P use pipes for the conversion $warn"
  65.   exit 1
  66. fi
  67.  
  68. opt=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
  69. case "$opt" in
  70.   *t*) check=1; opt=`echo "$opt" | sed 's/t//g'`
  71. esac
  72. case "$opt" in
  73.   *K*) keep=1; opt=`echo "$opt" | sed 's/K//g'`
  74. esac
  75. case "$opt" in
  76.   *P*) pipe=1; opt=`echo "$opt" | sed 's/P//g'`
  77. esac
  78. if test -n "$opt"; then
  79.   opt="-$opt"
  80. fi
  81.  
  82. for i do
  83.   n=`echo $i | sed 's/.gz$//'`
  84.   if test ! -f "$n.gz" ; then
  85.     echo $n.gz not found
  86.     res=1; continue
  87.   fi
  88.   test $keep -eq 1 && old=`wc -c < "$n.gz"`
  89.   if test $pipe -eq 1; then
  90.     if gzip -d < "$n.gz" | bzip2 $opt > "$n$ext"; then
  91.       # Copy file attributes from old file to new one, if possible.
  92.       test -n "$cpmod" && $cpmod $cpmodarg "$n.gz" "$n$ext" 2> /dev/null
  93.     else
  94.       echo error while recompressing $n.gz
  95.       res=1; continue
  96.     fi
  97.   else
  98.     if test $check -eq 1; then
  99.       if cp -p "$n.gz" "$n.$$" 2> /dev/null || cp "$n.gz" "$n.$$"; then
  100.     :
  101.       else
  102.     echo cannot backup "$n.gz"
  103.         res=1; continue
  104.       fi
  105.     fi
  106.     if gzip -d "$n.gz"; then
  107.       :
  108.     else
  109.       test $check -eq 1 && mv "$n.$$" "$n.gz"
  110.       echo error while uncompressing $n.gz
  111.       res=1; continue
  112.     fi
  113.     if bzip2 $opt "$n"; then
  114.       :
  115.     else
  116.       if test $check -eq 1; then
  117.     mv "$n.$$" "$n.gz" && rm -f "$n"
  118.         echo error while recompressing $n
  119.       else
  120.     # gzip $n  (might be dangerous if disk full)
  121.         echo error while recompressing $n, left uncompressed
  122.       fi
  123.       res=1; continue
  124.     fi
  125.   fi
  126.   test $keep -eq 1 && new=`wc -c < "$n$ext"`
  127.   if test $keep -eq 1 && test `expr \( $old + $block - 1 \) / $block` -lt \
  128.                   `expr \( $new + $block - 1 \) / $block`; then
  129.     if test $pipe -eq 1; then
  130.       rm -f "$n$ext"
  131.     elif test $check -eq 1; then
  132.       mv "$n.$$" "$n.gz" && rm -f "$n$ext"
  133.     else
  134.       bzip2 -d "$n$ext" && gzip "$n" && rm -f "$n$ext"
  135.     fi
  136.     echo "$n.gz smaller than $n$ext -- unchanged"
  137.  
  138.   elif test $check -eq 1; then
  139.     if bzip2 -t "$n$ext" ; then
  140.       rm -f "$n.$$" "$n.gz"
  141.     else
  142.       test $pipe -eq 0 && mv "$n.$$" "$n.gz"
  143.       rm -f "$n$ext"
  144.       echo error while testing $n$ext, $n.gz unchanged
  145.       res=1; continue
  146.     fi
  147.   elif test $pipe -eq 1; then
  148.     rm -f "$n.gz"
  149.   fi
  150. done
  151. exit $res
  152.