Unter Ubuntu 12.04 möchte ich 2 Verzeichnisse vergleichen, z. B. Ordner1 / und Ordner2 /, und alle Dateien kopieren, 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 abrufen:
rsync -rcnC --out-format="%f" folder1/ folder2/
Rsync scheint jedoch nicht in der Lage zu sein, diese Dateien in ein anderes Zielverzeichnis zu "exportieren". Kann ich die Liste an cp oder ein anderes Programm leiten, damit die Dateien kopiert werden, während auch die Verzeichnisse erstellt werden? Ich habe es zum Beispiel versucht
rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/
aber das würde auch keine Verzeichnisse erhalten, es würde einfach alle Dateien innerhalb von folder3 / kopieren
diff -qr
und verwendenawk
, um die Liste zu erstellen, dannrsync
...rsync --include-from=FILE
Option verwenden.Antworten:
Verwenden Sie --compare-dest.
Von der Manpage:
Überprüfen Sie zuerst Ihre Syntax mit --dry-run
Dann, wenn Sie mit der Ausgabe zufrieden sind:
Dieser Link enthält eine gute Erklärung des --compare-dest-Bereichs.
quelle
rsync -rcC --compare-dest=folder2/ folder1/ folder3/
rsync version 3.1.1 protocol version 31
auf meinem lokalen und Rsync versteht keine~/
Pfade für--compare-dest
param.--compare-dest
ein absoluter Weg gefragt.fonts/Makefile.in
Datei ausgegeben , die sowohl infolder2
als auch infolder1
dirs identisch ist .Dieses kleine Skript sollte funktionieren:
Aber ich denke auch, dass das Parsen der Ausgabe von diff -qr eine bessere Lösung wäre, da 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
unter dem schaffenfolder3
. Und es funktioniert nicht mit vollständigen Pfaden, aber auch das obige Skript funktioniert nicht mit vollständigen Pfaden.Ich habe
\"
in verwendetrsync
, damit es mit Dateien und Verzeichnissen funktioniert, die Leerzeichen enthalten. Getestet unter Ubuntu 10.04. Ich hoffe es hilft.quelle
Das ist die einfachste Form, die ich mir einfallen lassen könnte, wenn Sie bereit sind, sich
folder1
vor dem Ausgeben des Befehls zuerst zu begeben.Dies ist die langsamere Option, aber ich glaube, sie entspricht Ihren Anforderungen und kann mit nicht relativen Verzeichnisnamen ausgeführt werden:
Ich habe Ihren ursprünglichen
rsync
Befehl in Ruhe gelassen, weil Sie sagten, er gebe Ihnen die richtige Dateiliste (und meine Testdateien unterscheiden sich offensichtlich von Ihren, sodass ich nicht mit Sicherheit sagen konnte, dass ich die richtige Dateiliste erhalten würde, wenn ich Fehler mache damit).Das
grep
ist es Verzeichnisnamen aus dem Ausgang der zu entfernenrsync
.Die Ausgabe von
grep
wird dann an eine anderersync
Verwendung weitergeleitetxargs
. Im Parameter wirdfolder1/./{}
das Extra./
verwendet, um rsync anzuweisen , die relativen Verzeichnisse beginnend mit zu erstellen./{}
und zu ignorierenfolder1/
. Mit anderen Worten, es vermeidet das Erstellenfolder3/folder1/
.Ich konnte dies nur auf CentOS 6.4 testen, aber AFAIK sollte es in Ubuntu 12.04 genauso funktionieren.
EDIT: Ich sollte zur Kenntnis nehmen, dass die Antwort von Smithian zweifellos besser ist, aber ich wollte versuchen, es mit Ihrem ursprünglichen
rsync
Befehl im Takt zu tun, da es Ihnen die gewünschte Ausgabe gab.quelle