Lösung 1:
Verwenden Sie --compare-dest.
Aus der Manpage:
--compare-dest=DIR – Diese Option weist rsync an, DIR auf dem Zielcomputer als zusätzliche Hierarchie zu verwenden, um Zieldateien mit Übertragungen zu vergleichen (wenn die Dateien im Zielverzeichnis fehlen). Wenn eine Datei in DIR gefunden wird, die mit der Datei des Absenders identisch ist, wird die Datei NICHT in das Zielverzeichnis übertragen. Dies ist nützlich, um eine Sparse-Sicherung nur von Dateien zu erstellen, die sich gegenüber einer früheren Sicherung geändert haben.
Überprüfen Sie zuerst Ihre Syntax mit --dry-run
rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/
Wenn Sie dann mit der Ausgabe zufrieden sind:
rsync -aHxv --progress --compare-dest=folder2/ folder1/ folder3/
Dieser Link enthält eine gute Erklärung des Geltungsbereichs --compare-dest.
Lösung 2:
Dieses kleine Skript sollte funktionieren:
folder1="firsts_folder/"
folder2="second_folder/"
folder3="target_folder"
for x in `rsync -rcnC --out-format="%n" $folder1 $folder2`
do
if [ -d "$folder1/$x" ]; then
mkdir -p "$folder3/$x"
else
cp -frv $folder1/$x $folder3/$x
fi
done
Aber ich denke auch, dass das Analysieren der Ausgabe von diff -qr eine bessere Lösung wäre, weil es Ihnen Pfad und Namen für jede Datei konsistent gibt.
BEARBEITEN
Dies wäre ein Befehl, Ihr Befehl leicht modifiziert. Aber es wird folder1
erstellen unter folder3
. Und es funktioniert nicht mit vollständigen Pfaden, aber auch das obige Skript funktioniert nicht mit vollständigen Pfaden.
rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/
Ich habe \"
verwendet in rsync
damit es mit Dateien und Verzeichnissen funktioniert, die Leerzeichen enthalten. Getestet auf Ubuntu 10.04. Hoffe es hilft.
Lösung 3:
rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/
Das ist die einfachste Form, die mir einfallen könnte, wenn Sie bereit sind, zuerst in folder1
abzusteigen bevor der Befehl ausgegeben wird.
Dies ist das langsamere Option, aber ich glaube, es erfüllt Ihre Anforderungen, und es könnte mit nicht relativen Verzeichnisnamen ausgeführt werden:
rsync -rcnC --out-format="%n" folder1/ folder2/ |grep -vP "/$" |xargs -I{} rsync -R folder1/./{} folder3/
Ich habe Ihre ursprünglichen rsync
hinterlassen Befehl allein, weil Sie sagten, er würde Ihnen die richtige Dateiliste geben (und meine Testdateien unterscheiden sich offensichtlich von Ihren, daher konnte ich nicht mit Sicherheit sagen, dass ich die richtige Dateiliste erhalten würde, wenn ich damit herumspielen würde).
Die grep
dient dazu, Verzeichnisnamen aus der Ausgabe von rsync
zu entfernen .
Die Ausgabe von grep
wird dann zu einem anderen rsync
geleitet mit xargs
. Im Parameter folder1/./{}
die zusätzliche ./
wird verwendet, um rsync anzuweisen, die relativen Verzeichnisse beginnend mit ./{}
zu erstellen , wobei folder1/
ignoriert wird . Mit anderen Worten, es vermeidet die Erstellung von folder3/folder1/
.
Ich konnte dies nur auf CentOS 6.4 testen, aber AFAIK sollte es in Ubuntu 12.04 genauso funktionieren.
BEARBEITEN: Ich sollte diesen smithian beachten Die Antwort von ist zweifellos besser, aber ich wollte es mit Ihrem ursprünglichen rsync
versuchen Befehl intakt, da er Ihnen die gewünschte Ausgabe lieferte.