Pack demos.sh
Od HLDS.pl
Opis
Potrzebowałem pakować dema do Deathmatch Classic. Zapomniałem go tu wrzucić.
- daje możliwość tez automatycznego pakowania i segregowania dem wg daty rok/miesiac/dzien
- nie pakuje aktualnie nagrywanych dem
- nie usuwa źle spakowanego dema (np jak sobie dysk zapchasz :) )
- może usuwać stare spakowane dema, np starsze niż 14 dni
Parametry w konfiguracji, linia po linii (bez komentarzy):
- konfiguracja ścieżki w której znajduje się skrypt (WORKDIR)
- konfiguracja gdzie znajdują się dema do spakowania (SRCDIR)
- ścieżka gdzie zapisywać dema w formacie (DSTDIR)/rok/miesiac/dzien/
- wzorzec rozpoznawania dem, domyślnie hltv*.dem
- wzorzec rozszerzenia nazwy pliku dem - tego lepiej nie ruszaj
- wybór pakera, domyślnie tar
- opcje pakera, domyślnie dla bzip2
- rozszerzenie pakowanego dema, domyślnie tar.bz2
- plik tymczasowy do listy plików do spakowania
- log z wykonanych operacji
- ustawienie priorytetu aby nie zamulać procka (NICE)
- opcja kasacji starych spakowanych dem DELETE_OLD
- spakowane dema starsze niż X dni są kasowane (domyślnie 14)
Do crona wpisać cos w ten deseń:
20 5 * * * /home/hlds/scripts/pack_demos.sh > /home/hlds/scripts/pack_demos.cron.log 2>&1
Jak włączysz mózg i poczytasz manuala to dostosujesz do dowolnego packera i pakowania dowolnie pojawiających się cyklicznie plików (chociażby log, aczkolwiek tutaj lepiej byłoby pakować logi dniami a nie każde osobno)
Kod
#!/bin/bash # _KaszpiR_ kaszpir@gmail.com # Script to find and pack HLTV demos # if you want to change it to something else you must edit awk lines where the year/month/day is extracted from filename # ver 1.1 2009.08.31 # + added option to list directories for deletion older than X days # + added definiton for the extension files WORKDIR="/home/hlds/scripts" SRCDIR="/home/hlds/hlds/dmc" DSTDIR="/home/hlds/scripts/demos" NAMEPATTERN="hltv*.dem" EXTENSION=".dem" PACKER=`which tar` PACK_OPT="-Pjcf" PACK_EXT="tar.bz2" TMPFILE=".pack.tmp" LOGFILE="pack.log" NICE=20 ;# the niceness level, 20 = lowest, do it when cpu is idle , 0 = highest, do it as fast as possible by current user DELETE_OLD=1 ;#list dirs marked for deletion OLDER_THAN=14 ; # 14 days date >> $LOGFILE echo "================" cd $WORKDIR rm -f $TMPFILE #this is just for checking what the script will do , or debug mode if [ $1 ]; then find $SRCDIR -maxdepth 1 -type f -name $NAMEPATTERN -mmin +60 exit fi #find all files modifed over hour ago, so we gonna ignore the currently recorded demo find $SRCDIR -maxdepth 1 -type f -name $NAMEPATTERN -mmin +60 > $TMPFILE OYEAR="" OMONTH="" ODAY="" TOTAL=`wc -l $TMPFILE|awk '{print $1}'` echo "$TOTAL files." INCR=0; for f in `cat $TMPFILE` ; do # display enumerator on screen, for better view if the progress is made INCR=$((INCR + 1)) echo "$INCR / $TOTAL" # split filename to daytime format, and used to produce subdirectories and pack files into the proper dir YEAR=`echo $f | awk -F- '{print substr($2,1,2)}'` MONTH=`echo $f | awk -F- '{print substr($2,3,2)}'` DAY=`echo $f | awk -F- '{print substr($2,5,2)}'` if [ "$DAY" != "$ODAY" ];then # detect the day change and make new subdirectory FULLDATE="20$YEAR/$MONTH/$DAY" mkdir -p $DSTDIR/$FULLDATE ODAY=$DAY fi SUBNAME=`basename $f $EXTENSION` # run with lowest priority to avoid cpu usage nice -n$NICE $PACKER $PACK_OPT $DSTDIR/$FULLDATE/$SUBNAME.$PACK_EXT $f >> $LOGFILE 2>&1 if [ $? -eq 0 ]; then # packing completed, delete the source file rm -f $f else #packing failed, we leave the source file as it was echo "ERROR: not deleting $f" fi done if [ $DELETE_OLD == "1" ]; then echo "Listing old files" # delete days! del dirs full day older than print it just in case # mindepth is REQUIRED otherwise you will delete wrong directories, like whole current year or month find $DSTDIR -mindepth 3 -type d -daystart -mtime +$OLDER_THAN -print0 | xargs -0 echo fi echo "================"
Info
No dobra, jak ktoś przeczytał kod to sie pewnie kapął że nie będzie kasowanych katalogów ze starymi demami, bo jesk komenda echo a nie rm -rf
Tyle, że trzeba BARDZO uważać co się będzie kasować, dlatego dałem echo.