Frage Kann ich mit rsync eine Liste mit nur geänderten Dateien erstellen?


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, eine Liste der Dateien zu erstellen, die sich während des rsync geändert haben.

Die Idee ist, dass wenn ich rsync ausführe, ich die Dateien ausgeben kann, die sich in eine Textdatei geändert haben - mehr auf ein Array im Speicher hoffend - bevor das Skript existiert, kann ich einen Befehl ausführen nur die geänderten Dateien.

Hat jemand einen Weg gefunden, solch eine 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

22
2017-08-07 14:30


Ursprung


→ sehen meine Antwort hier. Ebenfalls -i zum Aufteilen, aber mit ein paar mehr Drehungen ... - Frank Nocke


Antworten:


Sie können rsync verwenden --itemize-changes (-i) Option zum Generieren einer parsefähigen Ausgabe, die wie folgt aussieht:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile

Das > Zeichen in der ersten Position zeigt an, dass eine Datei aktualisiert wurde, die restlichen Zeichen geben an, warum, zum Beispiel hier s und t Geben Sie an, dass sich die Dateigröße und der Zeitstempel geändert haben.

Eine schnelle und schmutzige Möglichkeit, die Dateiliste zu erhalten, könnte sein:

rsync -ai src/ dest/ | egrep '^>'

Offensichtlich könnte fortgeschritteneres Parsing eine sauberere Ausgabe erzeugen :-)

Ich stieß auf diese großartige Verbindung, als ich versuchte, herauszufinden, wann --itemize-changes wurde eingeführt, sehr nützlich:

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (archivierter Link)


34
2017-08-07 14:45



Für eine sauberere Ausgabe wie erwähnt, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run würde nur die geänderten Dateien auflisten (verschiedene Prüfsumme), auf jeden Fall ein Hüter, thx :) FYI Putting --dry-run nach dem Befehl anstelle der Verwendung des n Option ist für mich eine Best Practice - MediaVince
Im Wesentlichen das Gleiche wie rsync -zavc src/ dest/ --dry-run ohne wortreich - MediaVince


Benutze die -n Flagge, kombiniert mit der -c Prüfsummenflag und der -i Flagge:

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

In diesem Beispiel wurde nur eine Datei basierend auf dem Inhalt der Datei geändert. Es wird jedoch keine Dateisynchronisierung aufgrund der -n Flagge

Bonus

Wenn Sie die geänderten Dateien ausführen möchten, analysieren Sie sie mit sed oder ähnlich und mit xargs verarbeiten, zum Beispiel:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

13
2017-08-07 14:56



sed -> cut -d ' ' -f2,- - MUY Belgium
-n --dry-run, -c --checksum, -i --itemize-changes - ThorSummoner


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, (Abschnitt log format von man rsyncd.conf)

P.S. rsync Version 3.1.0


1
2018-02-06 14:40



Tatsächlich diese Antwort erwähnte diese Option - Cychih