Portál AbcLinuxu, 10. května 2025 09:49

Dotaz: smazání starých záloh

5.8.2010 19:28 donjirka
smazání starých záloh
Přečteno: 631×
Odpovědět | Admin
Zdravím, potřeboval bych poradit s tím jak napsat skript který smaže všechny staré soubory ze složky ale nechá jen např. 3 nejaktuálnější kterých se nedotkne. Našel jsem jen návody kde skript maže soubory po určitém počtu dní ale v tom je problém protože když záloha neproběhne vícekrát po sobě hrozí smazání všech záloh. Snažil jsem se to vytvořit tak že jsem nechal vypsat všechny tary do souboru a ty které nemají být smazané jsem dal do souboru2. Pak jsem podmínkou if nadefinoval porovnání souborů, když se neshodovala tak se spustilo mazání souborů po jednom od zadu jenže to má velikou trhlinu protože když se uděje cokoliv nestandardního tak se můžou smazat všechny...... Ještě mě napadá neumí např. tar sám do sebe vytvořit jen určitý počet archivu a potom je od zadu přepisovat. Skript na to mazání ani uvádět nebudu protože je to mazanina a určitě nesmysl. Skript na zálohu vypadá takto:

d=`date '+%Y%m%d%H%M'`

tar -cf ~/archive/archiv$d.tar ~/neco/* &>> ~/tmp/tar

echo $d &>> ~/tmp/tar

Díky za nápady
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.8.2010 20:13 voda | skóre: 28
Rozbalit Rozbalit vše Re: smazání starých záloh
Odpovědět | | Sbalit | Link | Blokovat | Admin
Co třeba: ls * | sort | head -n-3 | xargs rm
5.8.2010 22:33 donjirka
Rozbalit Rozbalit vše Re: smazání starých záloh
tak tohle bylo přesně ono mockrát díky....asi to není moc elegantní způsob jak jsem to vytvořil ale funguje to dobře .....jsem úplný začátečník......ještě tam přidělam aby se to opakovalo dokud to nezahlásí nemohu smazat....

cd ~/tmp

ls archiv* | sort -r | head --lines=3 > soubor.lst

ls archiv* | sort -r > soubor1.lst

soubor=soubor.lst

soubor1=soubor1.lst

if ( cmp $soubor $soubor1 ) then

echo "nemohu smazat archivy protože zbývají 3 poslední"

else

ls archiv* | sort | head --lines=1 | xargs rm -f

echo "nepotřebné archvívy vymazány"

fi

6.8.2010 07:13 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: smazání starých záloh
Špatně.

Pokud uděláte ve skriptu "cd" tak nesmíte neúspěch ignorovat. Raději
cd ~/tmp || exit 1
Mazání starých záloh (cd+rm) je typická cesta jak jednoho dne smazat něco v úplně jiném adresáři.
In Ada the typical infinite loop would normally be terminated by detonation.
6.8.2010 15:39 donjirka
Rozbalit Rozbalit vše Re: smazání starých záloh
děkuji za opravu....toto je můj první skript který jsem vytvořil takže ještě nedokážu přesně určit kde se může stát nějaká chyba

Dnes sem skript ještě trochu upravil

#!/bin/bash

cd ~/archiv || exit 1

# vyhledá všechny archivy ve složce a setřídí reverzně podle stáří (zobrazí jen prví 1,2,3 lines)

ls archiv* | sort -r | head --lines=3 > log/soubor1.lst

ls archiv* | sort -r | head --lines=2 > log/soubor2.lst

ls archiv* | sort -r | head --lines=1 > log/soubor3.lst

ls archiv* | sort -r > log/soubor.lst

# proměnné

soubor=log/soubor.lst

soubor1=log/soubor1.lst

soubor2=log/soubor2.lst

soubor3=log/soubor3.lst

# porovná soubory a pokud je splněna alespoň jedna z podmínek (existují 1 nebo 2 nebo 3 archivy) vypíše hlášku

if ( `cmp -s $soubor $soubor1` || `cmp -s $soubor $soubor2` || `cmp -s $soubor $soubor3` ); then

echo "tyto archivy jsou zachovány

`cat $soubor`

`date`"

else

# vyhledá všechny archivy seřadí podle stáří vypíše první a smaže ho

ls archiv* | sort | head --lines=1 | xargs rm -f

echo "nepotřebné archvívy vymazány"

# aby se akce opakovala dokud nezůstanou jen 1,2 nebo 3 archivy

~/archiv/script/./script2.sh

fi

Popisu si nevšímejte to jem dělal abych se v tom vyznal...
6.8.2010 18:50 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: smazání starých záloh
No, za prvé ls neřadí implicitně podle času ale abecedně, takže se smažou nesprávné soubory. Za druhé nechápu proč tam máte to 1,2,3. Za třetí není radno ze skriptu rekurzivně volat sebe sama.

Pokud chcete smazat všechno kromě 3 nejnovějších, tak prostě použijte
#!/bin/sh

cd ~/archiv || exit 1
ls -tr archiv* | head -n -3 | xargs rm -f
Pokud tomu nevěříte tak si na to napište program který to za Vás vyzkouší:
#!/bin/sh

pocatecni_soubory_od_nejstarsiho="archiv-q
archiv-w
archiv-e
archiv-r
archiv-t
archiv-a
archiv-s
archiv-d"

ocekavane_koncove_soubory_od_nejstarsiho="archiv-a
archiv-s
archiv-d"

# vytvoreni pocatecniho stavu
rm -f archiv*
for soubor in $pocatecni_soubory_od_nejstarsiho; do
        touch $soubor
        sleep 2
done

# testovana funkce - smazani
ls -tr archiv* | head -n -3 | xargs rm -f

# porovnani ocekavaneho vysledku s realitou
realne_koncove_soubory=`ls -tr archiv*`
if [[ "$realne_koncove_soubory" = "$ocekavane_koncove_soubory_od_nejstarsiho" ]]; then
        echo mazani funguje jak ma
else
        echo mazani nefunguje
        echo ocekavano:
        echo "$ocekavane_koncove_soubory_od_nejstarsiho"
        echo realita:
        echo "$realne_koncove_soubory"
fi
In Ada the typical infinite loop would normally be terminated by detonation.
6.8.2010 21:43 donjirka
Rozbalit Rozbalit vše Re: smazání starých záloh
no tak tohle je trochu jiná káva......napsat si program který to za mě vyzkouší by byla paráda ale problém je že to bych už nevymyslel. Už s tímhle jsem se páral cca 8 hodin :) ... možná za nějaký čas............ jinak díky určitě použiji vaše řešení.
7.8.2010 09:21 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: smazání starých záloh
napsat si program který to za mě vyzkouší by byla paráda ale problém je že to bych už nevymyslel.
Není to zas takový nápor na mozek - stačí 1) napsat konkrétní příklad stavu "před" a "po" a 2) porovnat to s tím, co dělá ten program.
Už s tímhle jsem se páral cca 8 hodin :)
Poprvé to vždycky dře, ale pak to jde samo.
In Ada the typical infinite loop would normally be terminated by detonation.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.