Frage Vergleiche 2 Verzeichnisse und kopiere Unterschiede in einem 3. Verzeichnis


Mit Ubuntu 12.04 möchte ich 2 Verzeichnisse vergleichen, sagen wir Ordner1 / und Ordner2 / und kopiere alle Dateien, die sich von Ordner3 / unterscheiden. Es gibt auch verschachtelte Dateien, daher sollten auch passende Unterverzeichnisse kopiert werden

Gibt es einen einzigen Befehl, der mir helfen würde? Ich kann die vollständige Liste der geänderten Dateien erhalten:

rsync -rcnC --out-format="%f" folder1/ folder2/

Rsync scheint jedoch nicht in der Lage zu sein, diese Dateien in einem anderen Zielverzeichnis zu "exportieren". Kann ich die Liste zu cp oder einem anderen Programm leiten, so dass die Dateien kopiert werden, während die Verzeichnisse auch erstellt werden? Zum Beispiel habe ich es versucht

rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/

aber das würde Verzeichnisse auch nicht behalten, es würde einfach alle Dateien innerhalb von folder3 /


27
2018-05-08 12:50


Ursprung


Ich würde wahrscheinlich eine Kombination von verwenden diff -qr und awk um dann die Liste zu erstellen rsync... - ewwhite
Wie würde ich Rsync mit der Liste verwenden? - periklis
Ich würde entweder eine For-Schleife laufen lassen oder die rsync --include-from=FILE Möglichkeit. - ewwhite
(sei nicht faul ...) Aber die rsync Lösung unten ist elegant. - ewwhite


Antworten:


Verwenden Sie --compare-dest.

Von der man-Seite:

--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 spärliche Sicherung nur von Dateien zu erstellen, die sich von einer früheren Sicherung geändert haben.

Überprüfe zuerst deine Syntax mit --dry-run

rsync -aHxv --progress --dry-run --compare-dest=folder2/ folder1/ folder3/

Dann, wenn Sie mit der Ausgabe zufrieden sind:

rsync -aHxv --progress  --compare-dest=folder2/ folder1/ folder3/

diese Verknüpfung hat eine gute Erklärung von --compare-dest scope.


32
2018-05-16 13:17



Danke dafür, ich hatte die man-Seite Erklärung dieses Parameters nicht verstanden. Für jeden Interessierten habe ich es mit gemacht rsync -rcC --compare-dest=folder2/ folder1/ folder3/ - periklis
schnelle Notiz für OsX Benutzer. ich habe rsync version 3.1.1 protocol version 31 auf meinem lokalen und rsync nicht verstehen ~/ Wege für --compare-dest param. - Jevgeni Smirnov
Für mich, --compare-dest benötigt einen absoluten Pfad. - palswim
Ich habe nicht mit den Optionen von Autor oder OP gearbeitet. I.e. es gibt aus fonts/Makefile.in Datei, die in beiden identisch ist folder2 und folder1 dirs. - Hi-Angel


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 Parsen der Ausgabe von diff -qr eine bessere Lösung wäre, weil es Pfad und Name für jede Datei konsistent gibt.

BEARBEITEN

Dies wäre ein Befehl, Ihr Befehl leicht modifiziert. Aber es wird schaffen folder1 unter dem folder3. Und es funktioniert nicht mit vollständigen Pfaden, aber das obige Skript funktioniert auch nicht mit vollständigen Pfaden.

rsync -rcnC --out-format="\"%f\"" folder1/ folder2/ | xargs cp --parents -rfvt folder3/

ich benutzte \" im rsync damit es mit Dateien und Verzeichnissen funktioniert, die Leerzeichen enthalten. Getestet auf Ubuntu 10.04. Ich hoffe es hilft.


3
2018-05-08 15:16



Dank dafür hatte ich gehofft, dass ein einziger Befehl existieren würde - periklis


rsync -rcnC --out-format="%f" . ../folder2/ |xargs cp --parents -rt ../folder3/

Das ist die einfachste Form, die ich mir vorstellen kann, wenn Sie bereit sind, zuerst hineinzugehen folder1 bevor Sie den Befehl absetzen.

Dies ist das Langsamer Option, aber ich glaube, dass es Ihren Anforderungen entspricht, 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 dein Original vergessen rsync Befehl allein, weil Sie sagten, dass es Ihnen die korrekte Dateiliste gab (und meine Testdateien sind offensichtlich anders als Ihre, also konnte ich nicht sicher sagen, dass ich die korrekte Dateiliste bekommen würde, wenn ich damit durcheinander komme).

Das grep Gibt es Verzeichnisnamen aus der Ausgabe von entfernen rsync.

Die Ausgabe von grep wird dann zu einem anderen geleitet rsync verwenden xargs. Im Param folder1/./{} Das Extra ./ wird verwendet, um rsync anzuweisen, die relativen Verzeichnisse zu erstellen, die mit beginnen ./{}ignorierend folder1/. Mit anderen Worten, es vermeidet das Erstellen folder3/folder1/.

Ich konnte dies nur auf CentOS 6.4 testen, aber AFAIK sollte in Ubuntu 12.04 genauso funktionieren.

BEARBEITEN:  Ich sollte das beachten SchmiedDie Antwort ist zweifellos besser, aber ich wollte es mit deinem Original tun rsync Befehl in Takt, da es Ihnen die gewünschte Ausgabe gab.


2
2018-05-16 22:24