Ich verwende rsync in einem Bash-Skript, um Dateien zwischen einigen Servern und einem NAS synchron zu halten. Ein Problem, auf das ich gestoßen bin, ist der Versuch, eine Liste der Dateien zu generieren, die sich während des rsync geändert haben.
Die Idee ist, dass ich, wenn ich rsync ausführe, die geänderten Dateien in eine Textdatei ausgeben kann - mehr in der Hoffnung auf ein Array im Speicher -, bevor das Skript existiert, kann ich nur die geänderten Dateien überprüfen .
Hat jemand eine Möglichkeit gefunden, eine solche Aufgabe auszuführen?
# specify the source directory
source_directory=/Users/jason/Desktop/source
# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination
# run the rsync command
rsync -avz $source_directory $destination_directory
# grab the changed items and save to an array or temp file?
# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
# chown the file owner and notify the user
chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done
-i
für itemize, aber mit ein paar weiteren Drehungen ...Antworten:
Sie können die Option
--itemize-changes
(-i
) von rsync verwenden , um eine syntaktisch analysierbare Ausgabe zu generieren, die folgendermaßen aussieht:Die
>
Zeichen in der ersten Position zeigen , wurde eine Datei aktualisiert, zeigen die verbleibenden Zeichen , warum zum Beispiel hiers
undt
zeigen an, dass die Dateigröße und Zeitstempel geändert.Ein schneller und unsauberer Weg, um die Dateiliste abzurufen, könnte sein:
rsync -ai src/ dest/ | egrep '^>'
Offensichtlich könnte ein fortgeschritteneres Parsen zu einer saubereren Ausgabe führen :-)
Ich bin auf diesen großartigen Link gestoßen, als ich versuchte herauszufinden, wann er
--itemize-changes
eingeführt wurde. Sehr nützlich:http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (archivierter Link)
quelle
rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run
würden Liste nur die geänderten Dateien ( verschiedene Prüfsumme ), auf jeden Fall einen Halter, thx :) FYI setzen ,--dry-run
anstatt die nach dem Befehln
Option ist für mich ein Best Practicersync -zavc src/ dest/ --dry-run
ohne ausführlicheVerwenden Sie die
-n
Flagge in Kombination mit der-c
Prüfsummenflagge und der-i
Flagge:In diesem Beispiel wurde nur eine Datei basierend auf dem Inhalt der Datei selbst geändert. Aufgrund des
-n
Flags wird jedoch keine Dateisynchronisierung durchgeführtBonus
Wenn Sie chown für die geänderten Dateien ausführen möchten, analysieren Sie sie mit
sed
oder ähnlichem und verarbeiten Sie sie mit xargs, zum Beispiel:quelle
sed
->cut -d ' ' -f2,-
-n --dry-run
,-c --checksum
,-i --itemize-changes
Diese Frage ist ein bisschen alt, aber ich denke, es lohnt sich, hinzugefügt zu werden:
-i
ist eine Abkürzung von--out-format=%i%n%L
Und
%n
bedeutet der Dateiname, (Abschnittlog format
vonman rsyncd.conf
)PS rsync Version 3.1.0
quelle