Verständnisfrage find -mtime

edvsb

Registered User
Hallo zusammen,

da das reoback nicht so gearbeitet hatte wie ich es mir gewünscht hätte habe ich mir nun ein eigenes Bash-Skript geschrieben zur Sicherung von Daten. Allerdings treten da bei mir ein paar Verständnisprobleme auf.

Damit lese ich aus einem hist-File das Datum der letzten Vollsicherung und berechne die Tage
Code:
LAST_FULL=$(( ($(date "+%s") - $(date -d $(tail -n 1 hist_full) +"%s") ) / 86400));

Damit wird dann das eigentliche Archive angelegt
Code:
tar -czf $1 $(find $2 -type f -mtime -$LAST_FULL);

So, nun ist mein Problem das -mtime, das sich ja laut Doku nicht auf reine Tage, sondern auf Stunden bezieht, also n*24

Zwei Fragen dazu:

Angenommen der tar-Befehl startet um 03:00:00 und braucht 5 Minuten. Dann werden ja eigentlich bei -mtime -1 die letzten 24 Stunden genommen. Doch was ist mit dem der eigentlichen Laufzeit? Welchen Wert hat denn dieses "mtime" während dieser 5 Minuten Laufzeit? Immer 03:00:00 - 24h oder am Ende 03:05:00 - 24h. Wenn dem so wäre, dann würden in der Sicherung ja 5 Minuten fehlen.

Selbiges auch, wenn das Script manuell gestartet wird und nicht per Cron, dann dann kann die Startzeit ja auch unterschiedliche sein. Ist der letzte Durchlauf länger als 24 Stunden her, dann fehlen wieder Daten.

Kann man nicht irgendwie sagen "Alle Dateien die seit Datum x geändert oder erzeugt wurde"? Dieses "innerhalb der letzten 24 Stunden" finde ich zu ungenau.

Ok, dieses -newer habe ich schon entdeckt, aber dort das Datum und somit die Sicherung auf eine Datei zu beziehen, deren Wert per touch festgelegt ist finde ich auch sehr unsicher.

Ich hätte da also schon gerne eine Lösung, die das letzte Datum aus einer Datei ließt und dann alle Dateien ab diesem Datum berücksichtigt.

Gibt es so etwas überhaupt? Wie löst Ihr so etwas? Oder habe ich einen kompletten Denkfehler? In PHP könnte ich das lösen, aber eigentlich wollte ich das Script nicht in PHP schreiben.

Danke euch schon mal.

Nachtrag:
Wäre das eventuell eine Möglichkeit? Kann es leider nicht abschätzen
-daystart
misst die Zeiten für die -amin, -atime, -cmin, -ctime, -mmin und -mtime Eigenschaften vom Beginn des aktuellen Tages anstelle der letzten 24 Stunden.
Diese Option betrifft nur die Tests, die weiter hinten in der Kommandozeile geschrieben sind.

Oder das Datum inkl. Zeit aus dem Hist-File auslesen und dann bei eine temporären Datei per touch das Datum setzen und diese dann als Referenz für -newer verwenden?
Allerdings finde ich auch immer Lösungen mit -newermt "2010-01-13 00:00", doch das scheint es bei mir gar nicht zu geben.
 
Last edited by a moderator:
Nicht die Laufzeit von tar ist entscheidend, sondern die von find, welches die Argumentenliste bereitstellt - das sind sicherlich keine 5 Minuten.
Um das Problem zu lösen, würde ich find ein "-daystart" mit auf den Weg geben, dann bezieht es sich auf Mitternacht.
 
Hi Whistler,

danke für Deine Antwort, dann hat sich mein Nachtrag ja bestätigt, zumindest einer davon. Immer 24 zurück ab 00 Uhr.

Da das Backup aber leider nicht immer zur gleichen Zeit läuft oder eventuell auch mal per Hand tagsüber angeschmissen wird, wie sieht es aber mit der anderen Möglichkeit aus?

Code:
#LAST_FULL=$(( ($(date "+%s") - $(date -d $(tail -n 1 hist_full) +"%s") ) / 86400));
LAST_FULL=$(tail -n 1 hist_full);

# touch für Referenz von referenzfile
touch -t $LAST_FULL referenzfile

tar -czf $1 $(find $2 -type f -newer referenzfile);

In hist_full steht dabei das Datum vom Start der letzten erfolgreichen Sicherung, z.B. 201001131435 (manueller Start)

Danke und Gruß

Noch ein Nachtrag.
Das mit dem -newer ist doch nicht so gut, zumindest nicht wenn das Minutengenau ist. Wenn eine Backup Nachts gelaufen ist und tagsüber nochmal manuell gestartet wird, dann wird ja nur das zwischen der Nacht und now() gesichert. Das Backup aber überschrieben, somit wären die Daten vom Vortag verloren....
Hm, dann also doch über den weg mit -daytime -mtime

Aber kann es sein, dass dann der Wert ein anderer ist? bei -daytime -mtime -1 z.b. kommen nur Dateien von heute und nicht von 0 Uhr -24 Stunden. -daytime -mtime -2 hingegen bringt alles von gestern 13.1.10 0:00 bis jetzt aktuell. Stimmt das oder irre ich mich da?

Ich spiele mal ein wenig Alleinunterhalter :-)
-mtime -n: neuer als jetzt - 24h*n
-daystart -mtime -n: neuer als 00:00 - 24h*(n-1)
 
Last edited by a moderator:
Back
Top