Portál AbcLinuxu, 10. května 2025 08:08
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
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
#!/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 #endjinak 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.