
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-10
das, 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 find
Befehl 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 -daystart
das 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 find
von , -print0
Dateien mit Leerzeichen im Namen zu verarbeiten und optional -type f
keine 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, xargs
wird der Befehl (in diesem Fall tar
) mehrmals aufgerufen, um xargs
die 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=ustar
Parameter zum Abrufen einer POSIX-Tar-Datei. In Ihrem Fall müssten Sie die Ausgabe weiterleiten, gzip
um 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 -not
Argument verwenden. Sie können die Ausgabe dann an xargs
und dann an weiterleiten. Weitere Informationen zu Zeitargumenten tar
finden Sie auf der Manpage von .find
Aktualisieren:
Wie Anthon vorgeschlagen hat, können Sie die Modifikatoren +/- verwenden, um -mtime
den 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, s
entsprichtTage, Stunden, MinutenUndSekundenDies gibt Dateien aus, die neuer als 5d2h3m10s
und älter als geändert wurden.4d0h15m20s