it-swarm.com.de

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

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.

30
Joe Tsai

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.

30
Vincent

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
13
kabZX

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 ...)

6
Hugo Zaragoza

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

  • verwenden Sie --dry-run (oder -n), um Änderungen zu vermeiden
  • verwenden Sie --itemize-changes (oder -i), um nach Änderungen zu suchen
  • verwenden Sie --archive (oder -a), um alle Unterverzeichnisse abzurufen
  • benutze egrep 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:

  • für Änderungen von Quelle zu 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 awk magic hinzu: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'

0
Yvan

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".

0
rogerdpack