Die Option --link-dest von rsync führt aufgrund der Dateizeit keine Verknüpfung durch

Die Option --link-dest von rsync führt aufgrund der Dateizeit keine Verknüpfung durch

Betrachten Sie diesen Testfall:

mkdir a
echo 'blah' > a/test
mkdir b
echo 'blah' > b/test

rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

Wie erwartet erstellt rsync c/testeinen Hardlink von b/test(beachten Sie den Refcount von 2):

# ls -l c/test
-rw-r--r-- 2 root root 16 Jan  6 19:43 test

Sehen Sie sich nun Folgendes an:

rm -r c # start over
touch b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

Der Hardlink wird nicht erstellt:

# ls -l c/test
-rw-r--r-- 1 root root 16 Jan  6 19:50 test

Dermanpagessagt (Hervorhebung von mir):

Die Dateien müssen in allenkonserviertAttribute (z. B. Berechtigungen, möglicherweise Eigentumsrechte), damit die Dateien miteinander verknüpft werden können.

Ich denke jedoch, dass die Dateizeit standardmäßig nichtkonserviertund sollte daher hier keinen Unterschied machen.

Was ist los? Ist das ein Fehler? Was kann ich tun?

Mein Ziel ist es, Platz auf einem Continuous-Integration-Server zu sparen, der viele Zweige eines Repository hostet, indem ich alle identischen Dateien fest verlinke. Mein eigentlicher Befehl lautet also:
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123.
Das bedeutet, dass mir die Zeiten egal sind, also habe ich darüber nachgedacht, touchsie alle vor dem auf die aktuelle Zeit zu setzen, rsyncaber das wäre eine etwas grobe Lösung und außerdem scheint touch nicht rekursiv zu funktionieren.

Antwort1

Sie sehen die Ergebnisse des „Quick Check“-Algorithmus von rsync, der anhand ihrer Größe und ihres Zeitstempels entscheidet, ob Dateien übertragen werden. Wie ausführlich beschrieben in man rsync:

Rsync findet Dateien, die übertragen werden müssen, mithilfe eines „Quick-Check“-Algorithmus (standardmäßig), der nach Dateien sucht, deren Größe oder letzte Änderungszeit geändert wurde. Alle Änderungen an den anderen beibehaltenen Attributen (wie von Optionen angefordert) werden direkt an der Zieldatei vorgenommen, wenn der Quick-Check anzeigt, dass die Daten der Datei nicht aktualisiert werden müssen.

Sie haben die Wahl:

  • Wenn Sie möchten, dass der Zeitstempel ignoriert wird und Dateien nur auf Grundlage der geänderten Größe übertragen werden, können Sie diese --size-onlyOption verwenden.

    Beachten Sie, dass dies bedeutet, dass rsynceine geänderte Datei nicht übertragen wird, wenn die Datei durch die Änderung zufällig die gleiche Größe behält.

  • Wenn Sie rsyncstattdessen prüfen möchten, ob die Inhalte der Dateien tatsächlich identisch sind, verwenden Sie --checksum. Dies kann zu einer erheblichen Verlangsamung führen.

Der „Quick Check“-Algorithmus ist die Standardeinstellung, da er im Allgemeinen einen guten Kompromiss zwischen Geschwindigkeit und Genauigkeit darstellt.

verwandte Informationen