Frage Wie genau entscheidet rsync, was zu synchronisieren ist?


Ich finde mehrere Antworten auf die Frage, also wollte ich die Leute fragen, die sie tatsächlich benutzen, anstatt einfach nur den größten Blog zu machen, indem ich halb nutzlose Informationen ausfülle.

Szenario: Ich rsync -av --progress /dir/a /dir/b  und es macht seine Sache.

Ich füge neue Dateien zu / dir / a hinzu und führe denselben Befehl erneut aus, es weiß, was es getan hat und kopiert nur die neuen Dateien.

Ich füge neue Dateien zu / dir / a hinzu und benenne einige Dateien in / dir / b um und lösche vielleicht auch ein paar.

Wenn ich renne rsync -av --progress /dir/a /dir/b nochmal, was wird kopiert? Nur die neuen Dateien, weil es weiß, was es zuvor kopiert hat, oder die Dateien, die umbenannt / gelöscht wurden, weil sie nicht mehr vorhanden sind.

Und als Bonus, wenn die zuvor kopierten Dateien sind nochmal kopiert, gibt es eine Möglichkeit dies zu verhindern, so dass nur neue Zusätze zu / dir / a kopiert werden?

Im Moment bin ich glücklich, die Dinge manuell zu überprüfen, aber wenn die Daten größer werden, brauche ich mehr Automatisierung, um diese Aufgabe zu erledigen.


12
2017-10-29 13:59


Ursprung


Das -i Flagge ist sehr praktisch. Für jede Datei gibt es eine Match-Zeichenkette, die dekodiert werden kann, um zu sehen, warum sie übereinstimmte (Flag für Mod-Zeit, Flag für Größe, etc.) - BowlOfRed


Antworten:


Ich füge neue Dateien zu / dir / a hinzu und führe denselben Befehl erneut aus, es weiß, was es getan hat und kopiert nur die neuen Dateien.

Nein, es weiß nicht, was es in einem vorherigen Lauf getan hat. Es vergleicht die Daten auf der Empfangsseite mit den zu sendenden Daten. Mit ausreichend kleinen Daten ist dies nicht ersichtlich, aber wenn Sie über ausreichend große Verzeichnisse verfügen, ist die Zeit, die Sie vor dem tatsächlichen Start des Kopiervorgangs benötigen, leicht zu spüren.

Die Standardüberprüfung betrifft die Zeit und Größe der Dateiänderung. Von man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

Und:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Beachten Sie, dass dies von den von Ihnen verwendeten Optionen nicht impliziert wird. -a ist:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

16
2017-10-29 14:40



Beste Beschreibung habe ich (bisher) gesehen, danke - SPooKYiNeSS
Ein kleiner Zusatz. Umbenannte Dateien werden an beiden Enden als eindeutige Dateien behandelt. Angeben --fuzzy Einmal werden sie im selben Verzeichnis als gleich erkannt. Verwenden --fuzzy zweimal erweitert diese Fähigkeit auf andere Standorte. Sehen man rsync für Details. Natürlich, einer der Hauptgründe für die Verwendung rsync ist seine Fähigkeit, nur die Teile einer Datei zu kopieren, die sich geändert haben. Dies kann Übertragungen über ein Netzwerk viel schneller machen. Übrigens, die Checksummen-Option ist oben erwähnt für ihre Erklärung von wie rsync funktioniert. In den meisten Fällen sollte es nicht verwendet werden. - Joe


Allgemeines

Wenn ich richtig verstehe, rsync -av hat keinen Speicher, also kopiert es auch die Dateien, die umbenannt / gelöscht wurden, weil sie in der Quelle vorhanden sind, aber nicht mehr im Ziel vorhanden sind.

Tipps

  • Verwenden Sie die Option -n"Trockenlauf", um zu prüfen, was passiert, bevor Sie Ihren Lauf laufen rsync Befehlszeile.

  • Beachten Sie die besondere Bedeutung eines abschließenden Schrägstrichs nach dem Quellverzeichnis und sehen Sie den Unterschied zwischen

    rsync -av --progress dir/a/ dir/b
    

    und

    rsync -av --progress dir/a dir/b
    

    das ist in der Anleitung beschrieben man rsync.

Beispiel

Ihr Sonderfall (Hinzufügen einer Datei zum Quellverzeichnis 'a' und Entfernen einer Datei aus dem Zielverzeichnis 'b') fügt sowohl die hinzugefügte Datei als auch die zuvor kopierte Datei hinzu, da sie sich immer noch im Quellverzeichnis befindet. Dies geschieht sowohl mit als auch ohne die Option -u und ich kenne keine Option in rsync um das Problem einfach zu beheben, wenn Sie es im Quellverzeichnis behalten möchten.

Sie können es jedoch aus dem Quellverzeichnis entfernen oder den Dateinamen in die Datei einfügen excluded und benutze die Option --exclude-from=excluded (für viele Dateien) oder einfach --exclude=PATTERN für eine oder wenige Dateien.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Alternative: unison

Vielleicht möchten Sie das Tool testen unison, die ein synchronisieren Werkzeug. Es bietet eine visuelle Methode, um spezielle Fälle zu identifizieren und zu entscheiden, was zu tun ist. Es gibt eine GUI-Version (unison-gtk).


4
2017-10-29 14:57



Nette Beispiele, danke. Ich wusste das / am Ende Sache, ich frage nur das von der App, und verpasste es (und Sie können deutlich sehen, ich habe nur kopiert / gepostet - SPooKYiNeSS
Und wieder sendet es bevor ich fertig bin und lasse mich meinen Kommentar nicht bearbeiten ... Kopierte / klebte den zweiten. Ich schaue mir unuson an und schaue, ob es tun kann, was ich will, und wenn nicht, gehe ich zurück zu Plan b und mache einfach ein Drehbuch - SPooKYiNeSS
Ich habe benutzt unison-gtk seit mehreren Jahren, und ich bin glücklich damit. (Ich benutze rsync auch.) - sudodus


Es kopiert nur die neuen Dateien in / dir / a. Was auch immer Sie in / dir / b tun, wird ignoriert, es sei denn, Sie verwenden die Option --delete. In diesem Fall werden umbenannte Dateien in / dir / b gelöscht. Es wird force / dir / b genau wie / dir / a werden.

Über den Bonus meinst du wie im Falle der Umbenennung von Dateien in / dir / a und dann rsyncing zu / dir / b? Ich glaube nicht, dass es eine Möglichkeit gibt, rsync daran zu hindern, die Dateien in diesem Fall einfach erneut zu kopieren.


1
2017-10-29 14:24



Ich habe nicht erwartet, dass es einen anderen Weg gibt, als ein Attribut zu bestimmen, aber dann, wenn ich ein Kiddie-Skript mache und das Bedürfnis hätte. Danke für deine Antwort, zumindest weiß ich jetzt, was ich tun muss. - SPooKYiNeSS