Synchronisieren Sie Dateien rekursiv zwischen zwei Ordnern, in denen Dateien weniger als 24 Stunden alt sind

7

Ich möchte alle Dateien in einem Verzeichnis finden, die sich innerhalb von 24 Stunden befinden, und diese Dateien dann mit einem anderen Server synchronisieren.

Es gibt einige alte Dateien, die ich nicht übertragen möchte. Wenn diese alten Dateien jedoch aktualisiert werden, tue ich dies.

Ich habe darüber nachgedacht, ein Skript mit: find und dem Parameter -ctime zu schreiben und diese Ausgabe in eine Datei umzuleiten, aber ich weiß nicht, wie ich rsync dazu bringen kann, dies effektiv zu nutzen, oder ob es eine bessere Möglichkeit gibt, eine Reihe von zu übertragen Dateien, die sich in den letzten 24 Stunden geändert haben.

Dieser Prozess muss sehr häufig ausgeführt werden, daher suche ich nicht nach etwas zu Ineffizientem. (wie z. B. FTP verwenden und jedes Mal alles senden).

Irgendwelche Ideen geschätzt.

Quaternion
quelle
Ich habe meine Antwort erneut aktualisiert. Es scheint --include-fromnicht genug zu sein, da das Standardverhalten darin besteht, alles einzuschließen. Sie müssen es allen explizit mitteilen, damit --excludees sich wie eine weiße Liste verhält.
SiegeX

Antworten:

7

Versuche dies:

cd /some/dir && rsync -av --files-from=<(find . -mtime 0 -printf "%p\n") <other stuff>

Es verwendet Process Substitution <( ) , um den findBefehl durch ein benanntes FIFO zu ersetzen, und gibt den Namen dieses Fifos an, um rsynczu lesen, was in die Synchronisierung aufgenommen werden soll.

Aktualisieren

In Anbetracht von Kyles Antwort scheint es definitiv --files-fromangemessener zu sein als --include-from; obwohl beide funktionieren werden. Antwort aktualisiert

SiegeX
quelle
1
rsyncist ein unidirektionales Einweg-Synchronisationssystem. Verwenden Sie unisondiese Option, wenn ein bidirektionales bidirektionales Synchronisierungssystem erforderlich ist.
Nikhil Mulley
3
#!/bin/sh
thefiles=/tmp/files.$$
LOCALDIR=/path/to/local/dir
REMOTEDIR=/path/to/remote/dir
REMOTEHOST=remote.host
changetime=24h

cd $LOCALDIR || { echo cd failed 1>&2; exit 1; }

trap 'rm -f $thefiles' 0

find . -type f -ctime -$changetime -print > $thefiles
rsync -v -n --archive --files-from=$thefiles . $REMOTEHOST:$REMOTEDIR

Dieses Skript führt find in $ LOCALDIR aus, speichert die Ergebnisse in einer Datei und weist rsync an, den Dateiinhalt als Liste von Dateien zu verwenden, die in das Verzeichnis $ REMOTEDIR auf dem Host $ REMOTEHOST übertragen werden sollen. Das Skript chdir ist in $ LOCALDIR enthalten, da der Befehl rsync relative Pfade benötigt, keine absoluten. Ich habe -v -n in den rsync-Argumenten belassen, damit Sie sehen können, was dies bewirkt, ohne etwas zu kopieren. Entfernen Sie -n, wenn Sie zufrieden sind. Das Skript macht, was Sie wollen.

Kyle Jones
quelle