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.
Rsync hat eine dry-run
Option:
-n, --dry-run show what would have been transferred
Ich bin mir nicht sicher, ob Sie das wollen.
Wenn Sie die Dateien diff
über zwei Bäume hinweg __en 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 diff
verwenden, um die Dateien zu vergleichen.
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
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 ...)
Aufbauend auf anderen Antworten und https://serverfault.com/a/618740/114520
--dry-run
(oder -n
), um Änderungen zu vermeiden--itemize-changes
(oder -i
), um nach Änderungen zu suchen--archive
(oder -a
), um alle Unterverzeichnisse abzurufenegrep
um Einträge beginnend mit Punkt herauszufiltern (keine Änderung)Was 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:
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"
Und wenn Sie nur die Dateien benötigen, fügen Sie einfach awk
magic hinzu: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'
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 [email protected]
# 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 «"[email protected]"» allows us to pass on arguments for rsync
# from the command line (after the two directories).
rsync -a "$REMOTE_DIR"/ "$tmpd/" --size-only "[email protected]"
# Compare both trees
meld "$LOCAL_DIR" "$tmpd"
Zum Beispiel:
$ cd svn
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Die Wahrheit ist, dass, wenn Sie rsync -v ...
ausführen und einen Dateinamen auf dem Bildschirm ausgeben, diese Datei übertragen wird (oder übertragen worden wäre, wenn Sie Folgendes tun - -Probelauf). Verwenden Sie den itemize-Modus, um festzustellen, warum rsync die Übertragung durchführen wollte: 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".