it-swarm.com.de

Wie synchronisiere ich zwei Ordner mit Befehlszeilentools?

Nach der Migration von Windows auf Linux möchte ich eine alternative Software zu Winmerge finden oder vielmehr Befehlszeilentools zum Vergleichen und Synchronisieren von zwei Ordnern unter Linux erlernen. Ich wäre Ihnen dankbar, wenn Sie mir sagen könnten, wie die folgenden Aufgaben in der Befehlszeile ausgeführt werden sollen ... (Ich habe diff und rsync studiert, brauche aber noch Hilfe.)

Wir haben zwei Ordner: "/ home/user/A" und "/ home/user/B"

Ordner A ist der Ort, an dem reguläre Dateien und Ordner gespeichert werden, und Ordner B ist ein Sicherungsordner, der als vollständiger Spiegel von Ordner A dient. (Nichts wird direkt vom Benutzer in Ordner B gespeichert oder geändert.)

Meine Fragen sind:

  • Wie liste ich Dateien auf, die nur in Ordner B existieren? (Zum Beispiel diejenigen, die seit der letzten Synchronisierung aus Ordner A gelöscht wurden.)

  • Wie kopiere ich Dateien, die nur in Ordner B existieren, zurück in Ordner A?

  • Wie liste ich Dateien auf, die in beiden Ordnern vorhanden sind, aber unterschiedliche Zeitstempel oder Größen haben? (Diejenigen, die seit der letzten Synronisierung in Ordner A geändert wurden. Ich möchte die Verwendung von Prüfsummen vermeiden, da Zehntausende von Dateien vorhanden sind und der Vorgang dadurch zu langsam wird.)

  • Wie erstelle ich eine exakte Kopie von Ordner A in Ordner B? Ich meine, kopieren Sie alles aus Ordner A in Ordner B, der nur in Ordner A vorhanden ist, und löschen Sie alles aus Ordner B, der nur in Ordner B vorhanden ist, ohne jedoch die Dateien zu berühren, die in beiden Ordnern gleich sind.

79
akopacsi

Dadurch wird Ordner A in Ordner B verschoben:

rsync -avu --delete "/home/user/A" "/home/user/B"  

Wenn Sie möchten, dass der Inhalt der Ordner A und B identisch ist, geben Sie /home/user/A/ (mit dem Schrägstrich) als Quelle. Dies nimmt nicht den Ordner A, sondern den gesamten Inhalt und legt ihn in Ordner B ab.

rsync -avu --delete "/home/user/A/" "/home/user/B"
  • -a Führen Sie die Synchronisierung durch, wobei alle Dateisystemattribute erhalten bleiben
  • -v ausführlich ausführen
  • -u kopiere nur Dateien mit einer neueren Änderungszeit (oder einem Größenunterschied, wenn die Zeiten gleich sind)
  • --delete Löschen Sie die Dateien im Zielordner, die in der Quelle nicht vorhanden sind

Manpage: https://download.samba.org/pub/rsync/rsync.html

106
TuxForLife

Sie könnten das von Benjamin Pierce bei U Penn entwickelte Tool unison verwenden.

Nehmen wir an, Sie haben zwei Verzeichnisse.

/home/user/Documents/dirA/ und /home/user/Documents/dirB/

Um diese beiden zu synchronisieren, können Sie Folgendes verwenden:

~ $ unison -ui text /home/user/Documents/dirA/ /home/user/Documents/dirB/

In der Ausgabe zeigt unison jedes Verzeichnis und jede Datei an, die in den beiden Verzeichnissen, die Sie synchronisieren möchten, unterschiedlich sind . Es wird empfohlen, beim ersten Durchlauf additiv zu synchronisieren (fehlende Datei an beiden Speicherorten zu replizieren), dann einen Synchronisationsbaum auf Ihrem Computer zu erstellen und zu verwalten. Bei nachfolgenden Durchläufen wird eine echte Synchronisation implementiert (dh wenn Sie eine Datei aus .../dirA löschen). Es wird auch aus .../dirB gelöscht. Sie können auch jede einzelne Änderung vergleichen und optional wählen, ob weitergeleitet werden soll oder Reverse Synchronisation zwischen den beiden Verzeichnissen.

Um die grafische Oberfläche zu starten, entfernen Sie optional einfach die Option -ui text aus Ihrem Befehl, obwohl ich die Verwendung der cli einfacher und schneller finde.

Mehr dazu: nison-Tutorial in der Unison-Benutzerdokumentation .

12
axolotl

Dies ist, was ich zum Sichern persönlicher Dateien verwende, wobei mir nicht alles wichtig ist, was von -a und möchten, dass weitere nützliche Informationen gedruckt werden.

rsync -rtu --delete --info=del,name,stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"

Aus der rsync-Manpage :

-r, - rekursiv
Dies weist rsync an, Verzeichnisse rekursiv zu kopieren.

-t, --times
Dies weist rsync an, Änderungszeiten zusammen mit den Dateien zu übertragen und diese auf dem Remote-System zu aktualisieren.

-u, --update
Dadurch wird rsync gezwungen, alle auf dem Ziel vorhandenen Dateien zu überspringen und eine geänderte Zeit zu haben, die neuer als die Quelldatei ist. (Wenn eine vorhandene Zieldatei eine Änderungszeit hat, die der der Quelldatei entspricht, wird sie aktualisiert, wenn die Größen unterschiedlich sind.)

--löschen
Dies weist rsync an, fremde Dateien von der empfangenden Seite zu löschen (solche, die nicht auf der sendenden Seite liegen), jedoch nur für die Verzeichnisse, die synchronisiert werden.

--info = FLAGGEN
Mit dieser Option können Sie die Informationsausgabe, die Sie anzeigen möchten, genau steuern.

Von rsync --info=help

DEL        Mention deletions on the receiving side  
NAME       Mention 1) updated file/dir names, 2) unchanged names  
STATS      Mention statistics at end of run (levels 1-3)

Dies ist zwar weniger explizit, aber scheinbar gleichwertig und kürzer:

rsync -rtuv --delete --info=stats2 "/home/<user>/<src>/" "/run/media/<user>/<drive>/<dst>"

-v, --verbose
Ein einzelnes -v gibt Ihnen Informationen darüber, welche Dateien übertragen werden, und eine kurze Zusammenfassung am Ende [stats1].

1
Honest Abe

Die Antwort von TuxForLife ist ziemlich gut, aber ich empfehle dringend, dass Sie bei der lokalen Synchronisierung -c Verwenden. Sie können argumentieren, dass es die Zeit-/Netzwerkstrafe nicht wert ist, dies für Remote-Synchronisierungen zu tun, aber es lohnt sich absolut für lokale Dateien, weil die Geschwindigkeit so groß ist.

-c, --checksum
       This forces the sender to checksum every regular file using a 128-bit  MD4
       checksum.   It  does this during the initial file-system scan as it builds
       the list of all available files. The receiver then checksums  its  version
       of  each  file  (if  it exists and it has the same size as its sender-side
       counterpart) in order to decide which files need to be updated: files with
       either  a  changed  size  or a changed checksum are selected for transfer.
       Since this whole-file checksumming of all files on both sides of the  con-
       nection  occurs  in  addition to the automatic checksum verifications that
       occur during a file's transfer, this option can be quite slow.

       Note that rsync always verifies that each transferred file  was  correctly
       reconstructed  on  the receiving side by checking its whole-file checksum,
       but that automatic after-the-transfer verification has nothing to do  with
       this  option's  before-the-transfer  "Does  this file need to be updated?"
       check.

Dies zeigt, wie Sie mit der gleichen Größe und den gleichen Zeitstempeln scheitern können.

Die Einrichtung

$ cd /tmp

$ mkdir -p {A,b}/1/2/{3,4}

$ echo "\___________from A" | \
      tee A/1/2/x  | tee A/1/2/3/y  | tee A/1/2/4/z  | \
  tr A b | \
      tee b/1/2/x  | tee b/1/2/3/y  | tee b/1/2/4/z  | \
      tee b/1/2/x0 | tee b/1/2/3/y0 >     b/1/2/4/z0

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b

Der Rsync, der nichts kopiert, da alle Dateien dieselbe Größe und denselben Zeitstempel haben

$ rsync -avu A/ b
building file list ... done

sent 138 bytes  received 20 bytes  316.00 bytes/sec
total size is 57  speedup is 0.36

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from b
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from b
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from b
b/1/2/x0
\___________from b    

Der Rsync, der korrekt funktioniert, weil er Prüfsummen vergleicht

$ rsync -cavu A/ b
building file list ... done
1/2/x
1/2/3/y
1/2/4/z

sent 381 bytes  received 86 bytes  934.00 bytes/sec
total size is 57  speedup is 0.12

$ find A b -type f | xargs -I% sh -c "echo %; cat %;"
A/1/2/3/y
\___________from A
A/1/2/4/z
\___________from A
A/1/2/x
\___________from A
b/1/2/3/y
\___________from A
b/1/2/3/y0
\___________from b
b/1/2/4/z
\___________from A
b/1/2/4/z0
\___________from b
b/1/2/x
\___________from A
b/1/2/x0
\___________from b
1
Bruno Bronosky

Sie können es folgendermaßen verwenden:

rsync -avu --delete /home/user/A/* /home/user/B/

Auf diese Weise kopieren Sie den Inhalt von Ordner A in Ordner B, nicht den Inhalt von Ordner A selbst.

0
Isaias Sanchez

Dies ist nicht ganz das Gleiche wie das, wonach Sie fragen, aber Sie könnten in Betracht ziehen, ein Tool zur Versionskontrolle zu verwenden. Tools wie Git erledigen alles, was Sie verlangen, und vieles mehr, insbesondere wenn Sie nicht direkt in Ordner B arbeiten, kann es interessant sein, einen Blick darauf zu werfen. Weitere Informationen zu git finden Sie hier

0
switch87

Sie könnten einen Blick auf Fitus/Zaloha.sh werfen. Es ist ein Synchronizer, der als Bash-Shell-Skript implementiert ist und nur Standard-Unix-Befehle verwendet. Es ist einfach zu bedienen:

$ Zaloha.sh --sourceDir="test_source" --backupDir="test_backup"
0
user380458