Wie erstelle ich SCP-/TAR-Dateien, die zwischen bestimmten Tagen liegen?

Wie erstelle ich SCP-/TAR-Dateien, die zwischen bestimmten Tagen liegen?

Ich muss DB-Logdateien zwischen zwei Suse-Servern kopieren, wobei ich NUR an Dateien zwischen dem 10.3.2013 und dem 13.3.2013 interessiert bin

Es ist erwünscht, die Dateien vor dem Kopieren zu komprimieren, also tare ich sie und verwende scp. Momentan verwende ich tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10das, was mir alle Dateien vom 10.3.2013 bis heute liefert. Aber ich brauche sie nicht alle. Und ich habe keinen Tar-Schalter gefunden.

Antwort1

Wie Bichoy angegeben hat, können Sie den findBefehl verwenden, um Dateien mit einer bestimmten Zugriffs-, Erstellungs- und Änderungszeit zu finden. Allerdings nimmt -mtime einen Offset in 24-Stunden-Schritten an und ist nicht immer bequem zu berechnen, es sei denn, Sie möchten etwas von vor einer bestimmten Anzahl von „Tagen“. Sie müssen dies mit kombinieren, um -daystartdas auf den Anfang des Tages zu „runden“.

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

Kombinieren Sie dies mit der Option findvon , -print0Dateien mit Leerzeichen im Namen zu verarbeiten und optional -type fkeine Verzeichnisse im gewünschten Zeitraum abzurufen:

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 groß wird, xargswird der Befehl (in diesem Fall tar) mehrmals aufgerufen, um xargsdie Argumente in die Befehlszeile einzufügen, die nicht unendlich ist. Um das zu umgehen, verwende ich immer cpio, das Dateinamen von stdin liest. Mit dem --format=ustarParameter zum Abrufen einer POSIX-Tar-Datei. In Ihrem Fall müssten Sie die Ausgabe weiterleiten, gzipum das gewünschte Ergebnis zu erhalten:

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

Antwort2

Sie können den Befehl überprüfen find, um eine Liste der Dateien zu erhalten, die tariert werden müssen. Sie können ein Start- und Enddatum (bis auf Sekunden genau) angeben, indem Sie die normalen Argumente -atime, -btime, -mtime... in Kombination mit dem -notArgument verwenden. Sie können die Ausgabe dann an xargsund dann an weiterleiten. Weitere Informationen zu Zeitargumenten tarfinden Sie auf der Manpage von .find

Aktualisieren: Wie Anthon vorgeschlagen hat, können Sie die Modifikatoren +/- verwenden, um -mtimeden Zeitraum anzugeben, ohne zu verwenden -not. Hier ist ein Beispiel:

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

Wo d, h, m, sentsprichtTage, Stunden, MinutenUndSekundenDies gibt Dateien aus, die neuer als 5d2h3m10sund älter als geändert wurden.4d0h15m20s

verwandte Informationen