Portál AbcLinuxu, 6. listopadu 2025 14:54
find zaloha-etc* -mtime +2 -print0 | xargs -0 rm -f. Kolikrat se ale stane, ze mi ty zalohy starsi nesmaze (pusteno cronem pokazde ve stejny cas). Kdyz to ale pustim rucne (tj. v jakykoliv jiny cas), tak se stare smazou a je vse OK. Nekde jsem tady cetl, ze to muze byt opozdenym koncem zalohy a hned to nesplni podminku casu. Jak ale mazat, aby koukal jen na datum a ne na cas? (jen doplnim, ze zalohy neprovadim kolem pulnoci)
find -name 'zaloha-etc*' -mtime....?
-daystart -mtime 3
Nemuzu to ted vyzkouset, protoze to dela fakt jen nekdy a v Cronu ve stejny cas...
, která vychází z man. Já bych to ale neřešil, stejně se smažou, pouze o den později
Measure times from the beginning of today rather than from 24 hours ago. So, to list the regular files in your home directory that were modified yesterday, do find ~/ -daystart -type f -mtime 1
a jeste mi do mailu prijde info, ze zaloha nebyla provedena.. i kdyz byla, ale stara se nesmazala..
#!/usr/bin/env bash
# promenne
CIL="/usr/zaloha"
ZDROJ="/etc"
PREFIX="etc_"
POSTFIX="`date +%d%m%y`.tar.bz2"
NAZEV=${PREFIX}${POSTFIX}
# vyzalohuje adresar $ZDROJ
tar -cjf ${CIL}/${NAZEV} "$ZDROJ" 2>/dev/null &&
# upravi prava zalohy
chmod 640 ${CIL}/${PREFIX}* &&
# nalezne a smaze zalohy starsi xx dni
find ${CIL}/${PREFIX}* -mtime +2 -print0 | xargs -0 rm -f
# synchronizuje s DVD-RAM
rsync -av --delete /usr/zaloha/ /media/dvd-ram/
# zasle informacni e-mail a zapise stav do logu
if [[ `echo $?` -eq 0 ]]; then
echo -e "`date` Zaloha "$ZDROJ" byla provedena." >> /var/log/zaloha.log
mail -s "zaloha "$ZDROJ"" email@example.net <<-MESSAGE
Dobry den,
Zaloha "$ZDROJ" byla provedena v `date +%H:%M` `date +%d.%m.%Y`
a je ulozena na serveru v "$CIL/$NAZEV"
Vas zalozni server :)
MESSAGE
else
echo -e "`date` Zaloha "$ZDROJ" SKONCILA CHYBOU!" >> /var/log/zaloha.log
mail -s "zaloha "$ZDROJ"" email@example.net <<-MESSAGE
Dobry den,
Zaloha "$ZDROJ" NEBYLA PROVEDENA v `date +%H:%M` `date +%d.%m.%Y`.
Vas zalozni server :(
MESSAGE
fi
#end
jinak mam tehle scriptu vic (na jine adresare) a jediny problem mi dela ten /etc ... zajimavy, scripty jsou identicky, jen menim promenne...
find ${CIL} -name "${PREFIX}*" -mtime +2 ...
# Delete older than last 7 backups (not 7 days)
ls -1t $DESTINATION | grep ^prefix | tail -n +8 | xargs rm
server:/usr# ls -1t /usr/zaloha | grep ^var_www_ | tail -n +4 var_www_150608.tar.bz2 server:/usr# ls -1t /usr/zaloha | grep ^var_www_ | tail -n +4 | xargs rm rm: cannot remove `var_www_150608.tar.bz2': není souborem ani adresářem
/usr/zaloha, jak to osetrit?
ls nevypisuje absolutní cestu.
Jako nejjednodušší řešení jsem použil to, že se před tím uvedeným příkazem na odstranění záloh přesunu do patřičného adresáře: cd $DESTINATION
Další možností by bylo doplnit ještě příkaz, který zyčátek každého řádku výstupu z ls doplní o ${DESTINATION}/. Napadá mě ošklivé řešení s awk, ale určitě by na to bylo lepší použít nějaký jiný příkaz:
ls -1t $DESTINATION | grep ^prefix | tail -n +8 | awk '{ "/usr/zaloha/" $0 }' | xargs rm
Místo /usr/zaloha/ by tam mělo být obecnější ${DESTINATION}, ale nepřišel jsem na to, jak escapovat ty uvozovky, aby došlo k expanzi proměnné.
var="ahoj"
gawk -v var2="$var" 'BEGIN {print var2}'
awk mi ve složených závorkách vypadlo print.
Takže by to mohlo být nějak takhle:
ls -1t "$DESTINATION" | grep ^prefix | tail -n +8 | awk -v dir="$DESTINATION" '{ print $dir "/" $0 }' | xargs rm
$dir má být jen dir, bez $.
ls -1t "$DESTINATION" | grep ^prefix | tail -n +8 | awk -v dir="$DESTINATION" '{ print dir "/" $0 }' | xargs rm
rsync, takže zde bych hledal možné problémy. Nebo na začátek scriptu přidej set -x a vyhodnocování si pak můžeš prohlédnout v mailu.
if [[ `echo $?` -eq 0 ]] je překombinované, použijte if [[ $? -eq 0 ]].
2>/dev/null. Takhle přicházíš právě o ten chybový výstup, kde tar možná říká, proč skončil neúspěsně.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.