Wie drucke ich Dateien, die mit rsync geändert worden wären?

32

Gibt es eine Möglichkeit, mit rsync die vollständigen Dateipfade für alle Dateien zu drucken, die sich unterscheiden, ohne dass tatsächlich Dateien übertragen werden?

Alternativ brauche ich eine Möglichkeit, um die Dateien über zwei Bäume (über SSH) zu verteilen, die nur auf einer Änderung der Größe oder der Zeit der letzten Änderung basieren.

Joe Tsai
quelle

Antworten:

33

Rsync hat eine dry-runOption:

-n, --dry-run               show what would have been transferred

Ich bin mir nicht sicher, ob Sie das wollen.

Wenn Sie diffdie Dateien über zwei Bäume verteilen möchten , können Sie die beiden Richtungen möglicherweise rekursiv mit find und pipe durchsuchen, um sie an ls auszugeben und beide an eine Datei weiterzuleiten. Sie könnten dann diffzum Vergleichen der Dateien verwenden.

Vincent
quelle
3
+1, dies ist in rsync eingebaut. Die Details der Ausgabe von --dry-runhängen von Ihrer Verwendung von -vund ab. --progress optionsWenn Sie also überhaupt keine Ausgabe erhalten, aktivieren Sie diese Optionen nach Bedarf. Mir ist aufgefallen, dass Verzeichnisnamen gesendet werden, auch wenn sich die Dateien nicht geändert haben. Sie können diese jedoch herausfiltern, indem Sie die Ausgabe durchlaufen lassen sed.
David Spillett
4
Aber --dry-run scheint Dateien anzuzeigen, auch wenn sie identisch sind.
Quantum7
14

Ich bevorzuge es, das --out-Format zu verwenden, um die Details zu sehen, und es auf weniger zu leiten:

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less
kabZX
quelle
7

rsync -rvn localdir targetdir

Das -n bedeutet, dass nur Aktionen angezeigt werden (ohne dass eine Aktion ausgeführt wird).

Beachte, dass du das 'v' brauchst, sonst wird dir nichts angezeigt! (die restlichen Antworten vergessen dies ...)

Hugo Zaragoza
quelle
2
Für Follower ist -n gleichbedeutend mit "--dry-run" :)
Rogerdpack
1

Aufbauend auf anderen Antworten und https://serverfault.com/a/618740/114520

  • Verwenden Sie --dry-run(oder -n), um Änderungen zu vermeiden
  • benutze --itemize-changes(oder-i ), um nach Änderungen zu suchen
  • Verwenden Sie --archive(oder -a), um alle Unterverzeichnisse abzurufen
  • verwenden egrepEinträge zum Ausfiltern von Punkt beginnen (keine Veränderung)

Welches gibt Ihnen: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

Wenn Sie nur eine Möglichkeit wünschen, können Sie den Befehl ändern:

  • für Änderungen von der Quelle zum Ziel: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • Für Änderungen von Ziel zu Quelle: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

Und wenn Sie nur die Dateien benötigen, fügen Sie einfach awkMagie hinzu:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'

Yvan
quelle
0

Ich würde für so etwas gehen:

#! /bin/bash 

set -eu   ## Stop on errors and on undefined variables

## The local directory name
LOCAL_DIR=$1
## The remote directory in rsync sintax. Example: "machine:directory"
REMOTE_DIR=$2

shift 
shift 
# Now the first two args are gone and any other remaining arguments, if any, 
# can be expanded with $* or $@

# Create temporary file in THIS directory (hopefully in the same disk as $1:
# we need to hard link, which can only made in the same partition)
tmpd="$(mktemp -d  "$PWD/XXXXXXX.tmp" )"

# Upon exit, remove temporary directory, both on error and on success
trap 'rm -rf "$tmpd"' EXIT

# Make a *hard-linked* copy of our repository. It uses very little space 
# and is very quick 
cp -al "$LOCAL_DIR" "$tmpd"

# Copy the files. The final «"$@"» allows us to pass on arguments for rsync 
# from the command line (after the two directories).
rsync -a "$REMOTE_DIR"/   "$tmpd/"  --size-only "$@"

# Compare both trees
meld "$LOCAL_DIR"  "$tmpd"

Beispielsweise:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Raúl Salinas-Monteagudo
quelle
0

Die Wahrheit der Sache ist , dass , wenn Sie laufen rsync -v ...und es gibt einen Dateinamen auf den Bildschirm, die Datei wird übertragen (oder hätte übertragen wurden, wenn Sie einen --dry-run tun). Um festzustellen , warum war rsync darüber zu übertragen, verwendet itemize - Modus: https://serverfault.com/a/618740/27813

Wie andere angemerkt haben, vergleicht rsync standardmäßig nur anhand der Dateigröße und des Zeitstempels, die beide übereinstimmen müssen. Andernfalls wird eine "Delta-Kopie" für diese Datei gestartet. Wenn Sie wirklich sehen möchten, welche Dateien unterschiedlich sind, verwenden Sie den Prüfsummenmodus "-c".

Rogerdpack
quelle