GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Vergleichen Sie 2 Verzeichnisse und kopieren Sie die Unterschiede in ein 3. Verzeichnis

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.


Linux
  1. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0?

  2. Bash =~ Regex und Https://regex101.com/?

  3. Installieren Sie Binärdateien in /bin, /sbin, /usr/bin und /usr/sbin, Interaktionen mit --prefix und DESTDIR

  4. Wechseln Sie das Verzeichnis und führen Sie die Datei in einem Befehl aus

  5. Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

So kopieren Sie Dateien und Verzeichnisse unter Linux

So verwenden Sie den cp-Befehl zum Kopieren von Dateien und Verzeichnissen

So sichern Sie Dateien und Verzeichnisse mit Rsync unter Linux

Linux-Dateien und -Verzeichnisse mit rsync synchron halten

So kopieren Sie Dateien und Verzeichnisse im Linux-Terminal

Linux /-Ordner und /root-Ordner