rsync nur die neuesten N GB an Dateien

rsync nur die neuesten N GB an Dateien

Ich habe zwei Verzeichnisse, dirA, das N GB an Daten enthält, und dirB, das nur die neuesten M GB an Daten aus dirA enthalten soll. Wenn Dateien zu dirA hinzugefügt werden, sollten sie auch zu dirB hinzugefügt werden, während die ältesten Dateien in dirB gelöscht werden sollten.

Ist das mit rsync möglich? Oder mit einer anderen Software?

Antwort1

Hier ist ein Versuch. Ein Wort der Warnung: Ich habe den folgenden Code nicht ausführlich getestet.

dirA=/path/to/dirA
dirB=/other/path/to/dirB

tmpdir=/path/to/tmpdir

cd "$dirA"
find . -type f -printf '%T@ %s %p\0' | sort -nr -z \
awk 'BEGIN {RS="\000"; ORS="\000"; maxsize=2147483648} 
{size += $2; if (size > maxsize) exit; print $3}' | \
rsync -Rpt --link-dest="$PWD" --files-from=- -0 . "$tmpdir" && \
rsync -rpt --delete "$tmpdir" "$dirB"

Einige Erklärungen:

  • Der Zweck der Teile find, sort, und awkbesteht darin, eine maschinenlesbare (d. h. durch Nullen getrennte) Liste der neuesten Dateien zu erhalten, die nach den neuesten zuerst sortiert ist, und diese Liste dann zu kürzen, wenn die kumulierte Größe 2 GiB erreicht (die 2147483648 sind einfach 2*2^30 Bytes oder 2 GiB; passen Sie diese Zahl nach Belieben an).
    Notiz:Dieweniger alsVergleich im awkTeil bedeutet, dass die Größe eine harte Obergrenze ist (ein "maximal"-Bedingung), sodass es zu Situationen wie der folgenden kommen kann: Wenn die neueste Datei 4 GiB groß wäre, würde nichts in die Synchronisierung einbezogen. Verschieben Sie die print $3an den Anfang der, { }um das entgegengesetzte Verhalten zu erhalten ("mindestens"), in diesem Fall würden Sie die 4-GiB-Datei erhalten und am Ende doppelt so viel synchronisieren, wie Sie beabsichtigt haben. Ich nahm an, dass die erste Option wünschenswerter wäre.
  • Der erste Schritt rsyncextrahiert diese Dateien an einen temporären Speicherort ( "$tmpdir"), behält aber den Pfad ( -Rauch bekannt als --relative) bei. Da er Hardlinks (mit --link-dest) und keine vollständige Kopie verwendet, benötigt dieser Schritt nur wenig Speicherplatz, $tmpdirmuss sich aber im selben Dateisystem wie befinden $dirA.
  • Der zweite rsyncAufruf führt die eigentliche Synchronisierung mit $dirBund --deletedas Löschen alter Dateien durch, die $dirBnicht in gefunden wurden $tmpdir. Der Grund für die Verwendung des temporären Verzeichnisses und die Ausführung in zwei Schritten liegt darin, dass ich noch keinen Weg gefunden habe, den Löschvorgang in nur einem Schritt zum Laufen zu bringen.

verwandte Informationen