több könyvtár törlése wildcard-dal (vagy akárhogy)

Fórumok

üdv!
abszolút ez lenne az első script, amit valaha is írtam linux alatt, szóval... bocs a bénaságomért!
google-ztam is persze, de biztos rosszul :(

a következő lenne a feladat (egy része legalábbis):
"rotációs mentést" csinálnék. minden napi mentés alkönyvtárakban van mentve, amiknek a neve: "nap_neve - dátum". azaz pl. a mai napi könyvtár: "péntek - 2008-08-08"
összesen 5 napi mentés forogna. ezért úgy képzeltem el, hogy a script része lenne az is, hogy törli az előző azonos napi könyvtárat, azaz jelen esetben törölni kéne a "péntek - 2008-08-01" nevűt.
ezt úgy akartam megoldani, hogy 'rmdir "péntek*"', de rájöttem, hogy az rmdir nem támogatja a *-ot. (vagy rosszul tudom?)
aztán próbálkoztam 'rm -rf "péntek*"'-kel is, de ez sem törölte, pedig az rm elvileg tudja a *-ot, nem?
'mv "péntek*" /dev/null' szintén nem akarja...

jelenleg ez a script:

#! /bin/sh

_day=$(date +%A)
_date=$(date +%F)
_fullpath="$_day - $_date"

rm -rf "/media/backup1/napi/$_day*"

mkdir "/media/backup1/napi/$_fullpath"
mkdir "/media/backup1/napi/$_fullpath/samba"
cp -a "/media/data/samba/dir1" "/media/backup1/napi/$_fullpath/samba"
cp -a "/media/data/samba/dir2" "/media/backup1/napi/$_fullpath/samba"

hogy tudom egyszerűen megoldani ezt? thx!

Hozzászólások

dir-nevek:
2008-08-08-pentek
2008-08-09-szombat
2008-08-10-vasarnap

rm -R $(ls --color=no | sort | head -1)
___
info

ez letörli a legelső (azaz legrégebbi dátummal kezdődő) könyvtárat, attól függetlenül, hogy az milyen napra esik.
azaz ha pl. van egy munkaszüneti nap, ami alatt nem történik backup, akkor ez a parancs azt nem veszi figyelembe, és mindenképpen törli a legrégebbi backupot, és akkor már csak 4 backupom fog forogni. pár munkaszüneti nap, és ha nem figyelek, marad 1 napi backupom a végén :)
vagy nem jól látom? :)

ez végülis tökéletesen jó is lenne, csakhogy nekem mégsem muködik valamiért :(

csináltam egy tesztet. ez a script:


#! /bin/sh
_src="/media/data/samba"
_dest="/media/backup1/napi"
_day=$(date +%A)
# a teszt kedvéért ma csütörtök van:
_day=csütörtök
_date=$(date +%F)
_fullpath="$_date-$_day"

rm -rf `find $_dest -name '*$_day'`
echo "find $_dest -name '*$_day'"

#mkdir "$_dest/$_fullpath"
#mkdir "$_dest/$_fullpath/samba"
#touch "$_dest/$_fullpath/samba/ize.txt"

#cp -a "$_src/Árajánlatok megrendelések" "$_dest/$_fullpath/samba"
#cp -a "$_src/Inventor_Daten_10" "$_dest/$_fullpath/samba"

az rm -rf... sor nem törli le a könyvtárat, mert valamiért gondolom nem kapja meg a find... eredményét
pedig ha egy parancssorban csinálom, hogy pl:

find /media/backup1/napi -name '*csütörtök'

akkor az visszaadja, hogy pl.

2008-08-07-csütörtök

ha ezt bemásolom az rm -rf mögé, akkor szépen le is törli a könyvtárat
tehát parancssorban muködik, scriptben meg nem :(
az echo sort is azért tettem be, hogy lássam, hogyan is néz ki majd a find... parancs. és jól néz ki. ha amit az echo kiír, bemásolom parancssorba, az muködik is.
szóval megitn nem értem :(

yeah! :)
köszi! :)
most már minden zsír :)
most akkor berakom cron-dailybe
csak tudnám hogyan kell :)

egyébként egy általános kérdés: ha mondjuk ilyesmi scripteket csinálok, akkor azokat hová érdemes menteni? mert ezt (és a heti és havi mentés scripteket (azok egyszerűbbek, nincs rotáció) egyenlőre a home könyvtáramba csináltam és onnan futtatom őket kézzel.

most pofozom tovább a scripteket, és ezt az ötletet is szeretném hasznosítani.
méghozzá így: a heti mentések is "forognának", azaz a 31 napnál régebbiek törlésre kerülnének, így mindig csak 4-5 heti mentése maradna a gépen (ez elég lenne két havi mentés közti idő áthidalására)
a fenti parancsot használnám a scriptben így:
find $_dest -mindepth 1 -maxdepth 1 -type d -ctime +31 -exec rm -rf {} \;

a kérdésem az lenne, hogy:
1, a végén a "\;" az mire szolgál pontosan?
2, mi történik, ha valamiért nincs 31 napnál régebbi mentés és nem talál semmit? akkor az rm -rf paraméter nélkül gondolom hibával nem csinál semmit, ugye? vagy elkezd mindent törölni? na azt nem kéne...
3, mi történik, ha valamiért 2 (vagy több) találat is van? akkor mit és hogyan töröl?

1, talán egy escape karakter, ami azért van, hogy a ';'-t ne valami paraméternek, opciónak vegye (nem vagyok benne biztos) [szerk] a ';' meg gondolom azért kell, mert a -exec írhatsz még más kapcsolókat is... és a ; jelzi, hogy hol van annak a parancsnak a vége, amit exec-kel futtatni kell
2, az történik, mintha simán beírod, hogy rm -rf... Hiányzó paraméter, és nem történik semmi
3, használd az xargs-ot, valahogy így: find blabla | xargs -0 parancs
ekkor átadja a parancsnak szépen a paramétereket
--
Discover It - Have a lot of fun!

A *-ot a shell bontja ki (nem az rmdir). Az rmdir csak üres könyvtárat töröl. Szóköz pl. bezavarhat a * kibontásakor, mert két könyvtárnak veheti, ami egy.

Beírom a saját megoldásomat a rotációs backupra:


#!/bin/sh

cd /bekap
rm -rf backup.7
mv backup.6 backup.7
mv backup.5 backup.6
mv backup.4 backup.5
mv backup.3 backup.4
mv backup.2 backup.3
mv backup.1 backup.2
mv backup.0 backup.1

OPTS="-a --delete \
--ignore-errors \
--numeric-ids \
--link-dest=../backup.1"

echo "**** Backing up egyebek ****"
rsync ${OPTS} --rsh="ssh -l admin" 192.168.2.197:/projects/egyebek backup.0/
echo "**** Backing up engineering ****"
rsync ${OPTS} --rsh="ssh -l admin" 192.168.2.197:/projects/engineering backup.0/
echo "**** Backing up ford1 ****"
rsync ${OPTS} --rsh="ssh -l admin" 192.168.2.197:/projects/ford1 backup.0/
echo "**** Backing up ford2 ****"
rsync ${OPTS} --rsh="ssh -l admin" 192.168.2.197:/projects/ford2 backup.0/
echo "**** Backing up dtp ****"
rsync ${OPTS} --rsh="ssh -l admin" 192.168.2.197:/projects/dtp backup.0/

Előnyei:
* rsync gyorsabb, mint a cp, ha a fájlok hasonlók
* nem másoljuk le a változatlan fájlokat, csak linkeljük (takarékos a lemezhellyel)
* mégis 7 napra (vagy pontosabban 7 indításra) visszamenő teljes backup megvan az egyes backup.[szám] könyvtárakban.

na ez így frankó lett, köszönöm az eddigi segítséget! :) be is raktam a napi, heti és havi mentéseket cronba.
a napi az hétfőtől péntekig fut, minden nap 12:00-kor kezd. lemértem, és olyan 15 percig tart a napi mentés.
a heti minden hétfőn 12:30-kor kezdődik.
a havival viszont bajban vagyok. azt szeretném, hogy mondjuk minden hónap első hétfőjén fusson le. ez most így néz ki:
0 14 1-7 * 1 /usr/bin/backup-havi #havi mentés
jó ez így?

delre idoziteni backupot nem tul jo otlet... :) gondolom akkor hasznaljak a legtobben.
Az ilyeneket hajnalra szokas rakni, amikor semmi (vagy csak nagyon kicsi) load van.
Cronhoz meg kis help:


0 14 1-7 * 1 /usr/bin/backup-havi #havi mentés

| |   |  | |
| |   |  | \-- het napja
| |   |  \---- honap
| |   \------- honap napja
| \----------- ora
\------------- perc

Szerintem egyebkent jo.
[szerk] Nem jo :). a het napjahoz 2-t irj... tudod, hulye amerikaiak :P, ott a het elso napja vasarnap.
--
Discover It - Have a lot of fun!

nálunk délben van kicsi load, mert minenki elmegy ebédelni illetve netezik majszolgatás közben. :) a szerver meg nem megy 24/7, hanem reggel az első beérkező bekapcsolja, este mg az utolsó lekapcsolja. úgyhogy marad a dél körüli időpont.

amúgy a cron-t azt webminből adtam hozzá, ott állítottam be mindent, és ott hétfőt állítottam be, és így lett ez a cron sor, benne az "1" a végén. webmin szerint a 0 az a vasárnap.
a kérdés inkább az volt, hogy ha így adom meg (azaz minden hónap 1-7 napjain, ÉS azon belül hétfőn), akkor ez így egy AND kapcsolattal értendő? vagy OR? tehát csak akkor indítja el a jobot, ha a hónap első hete van ÉS hétfő is ráadásul?

AND kapcsolattal értendő? vagy OR?
Szerintem az elso ket erteket megnezve ez eldol :). "0-dik percben vagy 14-dik oraban" fusson le, vagy "0.dik percben és 14-dik oraban"?
Tehát mind között ÉS kapcsolat van, akkor fut le, ha minden teljesül.

A hétfővel kapcsolatba meg igazad van, 1... mert 0 a vasarnap.
--
Discover It - Have a lot of fun!

na most jött el az a pillanat, amikor az elmélet nem érvényesült a gyakorlatban. ugyanis a fenti beállítással, szerintem (szerintünk?) minden hónap első hétfőjén futna le a havi mentés skript.
ezzel szemben ma is lefutott. pedig most nem éppen hónap első hétfője van... :(
mi lehet a rossz? vagy hogy csináljam meg máshogy a minden-hónap-első-hétfője ütemezést?

szerk: ahá... mindig tanul az ember... szóval a fent iazt jelenti, hogy minden hónap 1-7 napjain _ÉS_ minden hétfőn. tehát nem minden hónap 1-7 napjai közül azokon, amelyek hétfőre is esnek... :(
szóval akkor hogyan tudom ezt megoldani? vagy pötyögjek be egy évre előre minden hónap első hétfőjére egy jobot?
vagy csináljak egy szkriptet, ami ellenőrzi a dátumot és a napot, és ha hónap első hétfője van, akkor futtassa a havi mentést? még tán ez a legjobb...

szerk2: no ez meg is volna. van egy külön szkriptecske (egy if gyakorlatilag), ami minden hétfőn fut le, és ha ($(date %d) -le 07) akkor meghívja a tényleges mentő szkriptet.
azért fura nekem, hogy a crontab-ban minden AND kapcsolattal értendő, kivéve az utolsót, a napot, mert az OR-ral. :S

man 5 crontab:

Note: The day of a command’s execution can be specified by two fields — day of month, and day of week. If both fields are restricted (i.e., aren’t *), the command will be run when either field matches the current time. For example, ‘‘30 4 1,15 * 5’’ would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.