Ahoj, stvořil jsem takovou šílenost (předem se omlouvám programátorům) na rotování logů z centrálního úložiště na přimountovaný filesystem.
Moje požadavky byly:
Aby Rsyslog ukládal logy do /var/syslog/remote/%HOSTNAME:::lowercase%/%$NOW%%HOSTNAME:::lowercase%.log.
Archivovat denně logy z lokálního disku serveru na pole.
V archivu zachovat adresářovou strukturu.
Možnost ověřit pravost logů. (dělám hash)
Skript sice funguje dobře, ale problém mám v tom, že se mi vůbec nelíbí jak jsem to napsal.
Nenašel by se někdo, kdo by se na ten kód mrknul a trochu konsolidoval případně potvrdil, že tam nejsou nesmysly?  

Předem děkuji
#!/bin/bash
# určení cest
volume="/mnt/d1vksc02/"                                                                 # složka kde je přimountovaný filesystem
odkud="/var/syslog/remote/"                                                             # složka kde se nacházejí logy
kam="/mnt/pole/syslog/remote/"                                                      # složka kam se mají logy přesouvat
hash="/mnt/pole/syslog/sum/"                                                        # složka pro sha1sum zabalených souborů
# kontrola namauntovaného disku pro archiv logů
function kontrola {
 # kontrola namauntovaného disku pro archiv logů
 if ! [ -d $odkud ]; then
  echo "neexistuje "$odkud
  exit
 fi
 # kontrola existence adresáře
 if ! [ -d $kam ]; then
  echo "neexistuje "$kam
  exit
 fi
 # vytvoření souboru hash.log pokud chybí
 if ! [ -e $hash'hash.log' ]; then
  touch $hash'hash.log'
 fi
 # kontrola jestli je přimountován filesystem
 if mount|grep $volume; then
  echo "není přimountován filesystem, není kam zálohovat"
  exit
 fi
}
# načte všechny soubory
function cteni_mv {
i="0"
echo "Čtu soubory pro přesun"
 while read file
 do
  array[ $i ]="$file"
  (( i++ ))
 done < <( find $odkud -type f -printf "%f\n" )
}
# přesune log soubory
function odsun {
echo "Přemisťuji logy z $odkud do $kam"
 for each in "${array[@]}"
 do
 # vytvoří složku když neexistuje adresář pro server
  each_=${each:10}
  if ! [ -d $kam${each_%.*} ]; then
   mkdir $kam${each_%.*}
  fi
  #echo "přemisťuji "$each
  mv $odkud${each_%.*}/$each $kam${each_%.*}/$each
 done
killall -HUP rsyslogd
}
# vypisuje pole array
function vypis {
echo "zahajuji výpis"
 for each in "${array[@]}"
 do
  echo "$each"
 done
}
# načte všechny log soubory
function cteni_gzip {
i="0"
echo "Čtu soubory pro balení"
 while read file
 do
  array[ $i ]="$file"
  (( i++ ))
 done < <( find $kam -name '*.log' -printf "%f\n" )
}
# přejmenuje, sbalí a vytvoří hash logům
function baleni {
echo "Balím logy"
cd $kam
 # krmení proměnné polem
 for each in "${array[@]}"
 do
 each_=${each:10}
 a="0"                                                                  # proměnná pro while cyklus
 i="0"                                                                  # počítadlo kopií souboru
  # ověřuje jetli archviv existuje
  if [ -e $kam${each_%.*}/$each'.gz' ]; then
   # cyklus jede do doby dokud není splněna podmínka
   while [ $a != "1" ] ; do
    # ověřuje jestli existuje přejmenovaný archiv z dřívějška a jede dokud nenajde poslední
    if [ -e $kam${each_%.*}/$each"($i).gz" ]; then
     (( i++ ))
     continue
    else
     # když najde volný název, přidá tam index $i a archivuje soubor
     a="1"
     mv $kam${each_%.*}/$each $kam${each_%.*}/$each"($i)"
     gzip -9 $kam${each_%.*}/$each"($i)"
     sha1sum $kam${each_%.*}/$each"($i).gz" >> $hash"hash.log"
    fi
   done
  else
   # archivuje v případě, že ještě neexistuje stejný archiv
   gzip -9 $kam${each_%.*}/$each                                         # zabalení logů
   sha1sum $kam${each_%.*}/$each'.gz' >> $hash"hash.log"                 # hash zabalených souborů
  fi
 done
}
kontrola
cteni_mv
#vypis 
odsun
cteni_gzip
#vypis
baleni
echo "Rotace dokončena"
exit