Ich suche nach einem Befehl / Skript, mit dem die zuletzt geänderten Dateien (bis zu 10 GB) auf einen anderen Computer kopiert werden können.
Wenn also 4 Dateien mit jeweils 4 GB vorhanden sind, sollten nur 2 vom Skript übertragen werden. Wenn 12 Dateien mit einer Größe von 1 GB vorhanden sind, sollten nur die letzten 10 Dateien übertragen werden.
scripting
rsync
cp
synchronization
Exussum
quelle
quelle
Antworten:
Hier ist ein Skript, das genau das tut, wonach Sie gefragt haben.
Die Anforderungen
Die Details
Es wird verwendet
rsync --dry-run
, um eine Liste der Dateien zu erstellen, die übertragen werden sollen (dies sind die geänderten Dateien). Anschließend wird eine Kombination ausdu
und verwendetls
, um Dateigröße und Zeit zu ermitteln. Anschließend werden die Dateien nach mtime sortiert und anschließend durchlaufen, bis die Gesamtgröße einen Schwellenwert überschreitet. Schließlich wird rsync erneut aufgerufen, wobei nur die zuletzt geänderten Dateien und die Gesamtgröße unter dem Schwellenwert liegen.Das Skript ist etwas hässlich, aber es funktioniert. Eine große Einschränkung besteht darin, dass es auf dem Computer ausgeführt werden muss, der das Verzeichnis rsync from enthält. Es kann geändert werden, um ssh zu verwenden, um ein entferntes Verzeichnis zu verwenden, aber diese Übergröße bleibt dem Leser überlassen.
Schließlich sind die
rsync
Optionen fest im Skript codiert. Dies ist jedoch eine einfache Änderung, wenn Sie sie in der Befehlszeile angeben möchten. Die Berechnung der Größe erfolgt ebenfalls in Bytes. Dies kann in Kilo / Mega / Gigabyte geändert werden, indem der Anruf auf du geändert und der Schwellenwert um denselben Faktor verringert wird.Verwendungszweck
Dabei
rsync-from-directory
handelt es sich um ein lokales Verzeichnis undrsync-to-directory
um ein lokales oder entferntes Verzeichnis. Die Standardoptionen sind fest codiert als-avz
und der Standardschwellenwert ist fest codiert als10GiB
.Das Skript
quelle
if (( "$size" > "$THRESHOLD" ))
fügen Sie in der letzten Schleife innerhalb der Bedingung eine Prüfung (vorbreak
) füri==0
und wenn ja, hinzuecho $f >> /tmp/rsyncfilelist
.Ich würde rsync "--dry-run" (oder "-n") verwenden, um die Liste der neueren Dateien zu erhalten. Dann würde ich einen anderen rsync mit der Option "--files-from = -" verwenden, um die Dateien zu senden. Dazwischen gibt es "hässliches" Perl .
Etwas wie das :
Hinweis: Ich habe nicht mit mehr als 10 GB getestet. Möglicherweise läuft Perl an einem bestimmten Grenzwert über. Um dies zu lösen, verwenden Sie Kbytes, anstatt Bytes zu zählen:
BEARBEITEN: Ich habe festgestellt, dass diese erste Lösung die Datei nicht nach mtime sortieren würde. Hier ist eine vollständigere Lösung (ähnlich dem Bash-Skript, das von einer anderen Person veröffentlicht wurde).
quelle
Sie können die sortierte Ausgabe von analysieren
du
. Angenommen, GNU-Dienstprogramme:POSIXly unter der Annahme, dass kein Dateiname ein Zeilenumbruchzeichen enthält:
Beachten Sie, dass
du
Unterverzeichnisse durchlaufen werden. Um dies zu vermeiden, teilendu
Sie mit , welche Dateien Sie bearbeiten möchten. Im Allgemeinen können Siefind
Dateien filtern.quelle
rsync
stattcp
.