Wie scp / tar-Dateien, die zwischen bestimmten Tagen liegen?

8

Ich muss Datenbankprotokolldateien zwischen zwei Suse-Servern kopieren, auf denen ich NUR zwischen dem 10.3.2013 und dem 13.3.2013 an Dateien interessiert bin

Es ist erwünscht, die Dateien vor dem Kopieren zu komprimieren, damit ich sie tariere und scp. Derzeit verwende ich tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10das gibt mir alle Dateien vom 10.3.2013 bis jetzt. Aber ich brauche nicht alle. Und ich habe keinen Teerschalter gefunden.

Radek
quelle

Antworten:

12

Wie von Bichoy angegeben, können Sie mit dem findBefehl Dateien mit einer bestimmten Zugriffs-, Erstellungs- und Änderungszeit suchen. -Mtime nimmt jedoch einen Versatz in Schritten von 24 Stunden vor und ist nicht immer bequem zu berechnen, es sei denn, Sie möchten etwas von einer bestimmten Anzahl von 'Tagen' vor. Sie müssen dies kombinieren, -daystartum dies auf den Anfang des Tages abzurunden.

Ich denke, in Ihrem Fall ist die Option -newermt praktischer, die einen Datenstring verwendet (und nicht den Namen einer Referenzdatei wie die meisten -newerXY-Versionen).

Kombinieren Sie dies mit findder -print0Option, Dateien mit Leerzeichen im Namen zu verarbeiten und optional -type fkeine Verzeichnisse in dem Zeitraum abzurufen, an dem Sie interessiert sind:

find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
   -newermt 20130310 -not -newermt 20130314 -type f -print0 \
   | xargs -0 tar -cvzf /tmp/saas_archive_logs.tar.gz 

Dabei gibt es ein großes Problem: Wenn die Anzahl der gefundenen Dateien zu lang wird, xargswird der Befehl (in diesem Fall tar) mehrmals xargsaufgerufen, um die Argumente in der Befehlszeile anzupassen, die nicht unendlich sind. Um das zu umgehen, benutze ich immer das cpio, das Dateinamen von stdin liest. Mit dem --format=ustarParameter zum Abrufen einer POSIX-TAR-Datei und in Ihrem Fall müssten Sie die Ausgabe durchleiten gzip, um das gewünschte Ergebnis zu erzielen:

find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
   -newermt 20130310 -not -newermt 20130314 -type f -print0 \
   | cpio --create --null  --format=ustar \
   | gzip > /tmp/saas_archive_logs.tar.gz
Anthon
quelle
Kann ich bei Verwendung Ihres Codes Stunden und Minuten angeben?
Radek
Ich habe es versucht, bevor ich meinen Kommentar gepostet habe, aber ... "find: Ich kann nicht herausfinden, wie man" 201302050000 "als Datum oder Uhrzeit interpretiert"
Radek,
@Radek Die kurze Antwort lautet Ja. Ich würde YYYYMMDDThhmm verwenden, um nicht mit Leerzeichen umgehen zu müssen. Die lange Antwort: Mann finden wird Ihnen sagen: Zeitangaben werden wie für das Argument zur Option -d des GNU-Datums interpretiert und mit Mann-Datum finden Sie... a mostly free format human readable date string ..... A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers
Anthon
@Radek danke für den Hinweis auf den Fehler, da ich meinen Kommentar nicht bearbeiten konnte, habe ich einen neuen mit einem Tzwischen den Tagen und Stunden eingefügten Kommentar wieder eingefügt. Das habe ich getestet und funktioniert. Irgendwie findweiß ich nicht, wie ich die Zeichenfolge anders teilen soll (wahrscheinlich, weil es YYMMDDhhmmss anstelle von YYYYMMDDhhmm sein könnte. Ich dachte, dass das Datum einen Punkt für die Sekunden benötigt ( .ss), aber das ist wahrscheinlich nur zum Einstellen des Datums.
Anthon
4

Sie können den findBefehl überprüfen , um eine Liste der Dateien zu erhalten, die tariert werden müssen. Sie können ein Start- und Enddatum (bis Sekunden Genauigkeit) angeben mit den normalen -atime, -btime, -mtime... Argumenten in Kombination mit dem -notArgumente. Sie können die Ausgabe dann an xargsund dann an weiterleiten tar. Überprüfen Sie die Manpage von findauf Details zu Zeitargumenten.

Update: Wie von Anthon vorgeschlagen, können Sie die Modifikatoren +/- verwenden -mtime, um den Zeitraum ohne Verwendung anzugeben -not. Hier ist ein Beispiel:

find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2

Wo d, h, m, sentsprechen Tage, Stunden, Minuten und Sekunden auf. Dies gibt Dateien, die neuer als 5d2h3m10sund älter als geändert wurden4d0h15m20s

Bichoy
quelle
2
Das Argument für -mtimemuss ein Versatz in Tagen sein, der nicht immer gilt, es sei denn, Sie haben diesen Versatz zwischen den Laufzeiten festgelegt. Sie können auch verwenden -mtime +Xund -mtime -Xvor und nach X Tagen angeben, anstatt -not zu verwenden.
Anthon
Wie lautet die Syntax zur Angabe des absoluten Datums und der absoluten Uhrzeit?
Radek