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
, undawk
besteht 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 imawk
Teil 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 dieprint $3
an 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
rsync
extrahiert diese Dateien an einen temporären Speicherort ("$tmpdir"
), behält aber den Pfad (-R
auch bekannt als--relative
) bei. Da er Hardlinks (mit--link-dest
) und keine vollständige Kopie verwendet, benötigt dieser Schritt nur wenig Speicherplatz,$tmpdir
muss sich aber im selben Dateisystem wie befinden$dirA
. - Der zweite
rsync
Aufruf führt die eigentliche Synchronisierung mit$dirB
und--delete
das Löschen alter Dateien durch, die$dirB
nicht 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.