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


26

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

→ Siehe meine Antwort hier . Auch -ifür itemize, aber mit ein paar weiteren Drehungen ...
Frank Nocke

Antworten:


42

Sie können die Option --itemize-changes( -i) von rsync verwenden , um eine syntaktisch analysierbare Ausgabe zu generieren, die folgendermaßen 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

Die >Zeichen in der ersten Position zeigen , wurde eine Datei aktualisiert, zeigen die verbleibenden Zeichen , warum zum Beispiel hier sund tzeigen 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-changeseingeführt wurde. Sehr nützlich:

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


2
Für eine saubere Ausgabe wie bereits erwähnt, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runwürden Liste nur die geänderten Dateien ( verschiedene Prüfsumme ), auf jeden Fall einen Halter, thx :) FYI setzen , --dry-runanstatt die nach dem Befehl nOption ist für mich ein Best Practice
MediaVince

Im Wesentlichen das gleiche wie rsync -zavc src/ dest/ --dry-runohne ausführliche
MediaVince

14

Verwenden Sie die -nFlagge in Kombination mit der -cPrüfsummenflagge und der -iFlagge:

# 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 selbst geändert. Aufgrund des -nFlags wird jedoch keine Dateisynchronisierung durchgeführt

Bonus

Wenn Sie chown für die geänderten Dateien ausführen möchten, analysieren Sie sie mit sedoder ähnlichem und verarbeiten Sie sie mit xargs, zum Beispiel:

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

3
sed->cut -d ' ' -f2,-
MUY Belgien

-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner

Ich folge nicht. Alle 3 dieser Dateien im Beispiel sind mit "> fcst" gekennzeichnet. Ich verstehe, dass dies "von der Fernbedienung empfangen werden" bedeutet, die Prüfsumme ist unterschiedlich, die Größe ist unterschiedlich, die Zeit ist unterschiedlich. Was bedeutet in der Ausgabe, dass "nur eine Datei geändert wurde"?
Bobpaul

1

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 %nbedeutet der Dateiname, (Abschnitt log formatvon man rsyncd.conf)

PS rsync Version 3.1.0


Eigentlich erwähnte diese Antwort diese Option
Cychih
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.