Wie genau entscheidet rsync, was synchronisiert werden soll?

14

Ich finde mehrere Antworten auf die Frage, wollte also die Leute fragen, die sie tatsächlich benutzen, anstatt nur das größte Blog zu machen, indem ich zufällig halbnutzlose Informationen ausfülle.

Szenario: Ich rsync -av --progress /dir/a /dir/b und es macht sein Ding.

Ich füge neue Dateien zu / dir / a hinzu und führe denselben Befehl erneut aus. Er weiß, was er 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. Vielleicht lösche ich auch einige.

rsync -av --progress /dir/a /dir/bWas wird kopiert, wenn ich erneut starte? Nur die neuen Dateien, weil es weiß, was es zuvor kopiert hat, oder die Dateien, die auch umbenannt / gelöscht wurden, weil sie nicht mehr vorhanden sind.

Und als Bonus, wenn die zuvor kopierten Dateien werden erneut kopiert, ist es eine Möglichkeit , das zu verhindern, so dass nur neue Ergänzungen / dir / a kopiert werden?

Im Moment überprüfe ich die Dinge gerne manuell, aber wenn die Daten größer werden, werde ich mehr Automatisierung benötigen, um diese Aufgabe auszuführen.

SPOOKYiNeSS
quelle
3
Die -iFlagge ist sehr praktisch. Für jede Datei gibt es eine Übereinstimmungszeichenfolge, die dekodiert werden kann, um festzustellen, warum sie übereinstimmt (Flag für die Mod-Zeit, Flag für die Größe usw.)
BowlOfRed

Antworten:

17

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

Nein, es weiß nicht, was es in einem vorherigen Lauf getan hat. Es vergleicht die empfangsseitigen Daten mit den zu sendenden Daten. Bei ausreichend kleinen Daten ist dies nicht ersichtlich. Wenn Sie jedoch über ausreichend große Verzeichnisse verfügen, ist der Zeitaufwand für den Vergleich vor dem eigentlichen Beginn des Kopiervorgangs leicht zu spüren.

Standardmäßig werden die Änderungszeiten und -größen der Dateien überprüft. 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 diese nicht durch die von Ihnen verwendeten Optionen impliziert werden. -aist:

-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
muru
quelle
Beste Beschreibung, die ich (bisher) gesehen habe, danke
SPooKYiNeSS
2
Ein kleiner Zusatz. Umbenannte Dateien werden an beiden Enden als eindeutige Dateien behandelt. Durch --fuzzyeinmaliges Angeben werden sie im selben Verzeichnis als gleich erkannt. Durch --fuzzyzweimaliges Verwenden wird diese Funktion auf andere Standorte ausgeweitet. Siehe man rsyncfür weitere Einzelheiten. Einer der Hauptgründe für die Verwendung rsyncist natürlich die Fähigkeit, nur die Teile einer Datei zu kopieren, die sich geändert haben. Dies kann die Übertragung über ein Netzwerk erheblich beschleunigen. Übrigens wird die Prüfsummenoption oben zur Erläuterung der Funktionsweise erwähnt rsync. In den meisten Fällen sollte es nicht verwendet werden.
Joe
6

Allgemeines

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

Tipps

  • Verwenden Sie die Option -n"Probelauf", um zu überprüfen, was passiert, bevor Sie Ihre rsyncBefehlszeile ausführen .

  • 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
    

    was im Handbuch beschrieben ist man rsync.

Beispiel

In Ihrem speziellen Fall (Hinzufügen einer Datei zum Quellverzeichnis 'a' und Entfernen einer Datei aus dem Zielverzeichnis 'b') werden sowohl die hinzugefügte Datei als auch die zuvor kopierte Datei hinzugefügt, da sie sich noch im Quellverzeichnis befindet. Dies geschieht sowohl mit als auch ohne die Option, -uund ich kenne keine Option rsync, um das Problem so 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 excludedund die Option --exclude-from=excluded(für viele Dateien) oder einfach --exclude=PATTERNfür eine oder mehrere Dateien verwenden.

$ 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

Möglicherweise möchten Sie das Tool testen unison, bei dem es sich um ein Synchronisierungstool handelt . Es bietet eine visuelle Methode, um Sonderfälle zu identifizieren und zu entscheiden, was zu tun ist. Es gibt eine GUI-Version ( unison-gtk).

Sudodus
quelle
Schöne Beispiele, danke. Ich wusste das / am Ende, ich frage dies nur von der App und habe es verpasst (und du kannst deutlich sehen, dass ich es gerade kopiert / gepostet habe
SPooKYiNeSS
Und wieder sendet es, bevor ich fertig bin, und lässt mich meinen Kommentar nicht bearbeiten ... Kopiert / eingefügt das zweite. Ich schaue mir withouton an und schaue, ob es tun kann, was ich will, und wenn nicht, gehe ich zurück zu Plan b und erstelle einfach ein Drehbuch
SPOOKYINESS
Ich benutze es unison-gtkseit mehreren Jahren und bin zufrieden damit. (Ich benutze rsyncauch.)
Sudodus
1

Es werden nur die neuen Dateien in / dir / a kopiert. 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 / dir / b zwingen, genau wie / dir / a zu werden.

Was den Bonus angeht, meinst du das, wenn du Dateien in / dir / a umbenennst und dann nach / dir / b synchronisierst? Ich glaube nicht, dass es eine Möglichkeit gibt, zu verhindern, dass rsync die Dateien in diesem Fall einfach erneut kopiert.

Hermann Ingjaldsson
quelle
Ich hatte nicht erwartet, dass es einen anderen Weg geben würde, als ein Attribut zu verwenden, um zu bestimmen, aber dann, wenn ich ein Kiddie-Skript machen würde und das Bedürfnis danach hätte. Vielen Dank für Ihre Antwort, zumindest weiß ich jetzt, was ich tun muss.
SPOOKYINESS