Zeilenenden bei Verwendung von Rsync ignorieren

518
Sergio

Ich möchte zwei Verzeichnisse synchronisieren. Das erste hat CRLFnormale Zeilenenden, das zweite Verzeichnis enthält auch Dateien mit CRLFnormalen Zeilenenden.

Das Problem ist, wenn ich diesen Code ausführen:

 rsync -azr --exclude=images --dry-run --delete --checksum --out-format="/%f" /dir1 /dir2 

Es zeigt, dass viele Dateien, die identisch sind, aber unterschiedliche Kodierungen haben, synchronisiert werden, und ich möchte nur die verschiedenen Inhaltsdateien synchronisieren.

Mit diffist es möglich, dies zu tun:

diff --strip-trailing-cr file1 file2 

Aber so etwas konnte ich für Rsync nicht finden. Wie kann ich nur Dateien mit unterschiedlichem Inhalt synchronisieren?

3
Können Sie Dateien in beiden Verzeichnissen desinfizieren? Kamil Maciorowski vor 5 Jahren 1
Willkommen bei Super User Sergio! Eine interessante Frage - ich habe es bearbeitet, um die Phrasierung und Formatierung zu vereinfachen. Fühlen Sie sich frei, um zurückzurollen, wenn Sie möchten :) bertieb vor 5 Jahren 0

1 Antwort auf die Frage

4
bertieb

Es gibt keine Option, die Zeilenenden für zu ignorieren rsync

Wie Sie herausgefunden haben, sind rsyncDateien mit unterschiedlichen Zeilenenden unterschiedlich. Dies ist in Ihrer Situation unbequem, da die Dateien visuell / semantisch gleich sind.

rsyncentscheidet, was in einer Datei synchronisiert werden soll, basierend auf Prüfsummen für Blöcke. Dazu gibt es einen guten Überblick :

(T) Die alte Version der Datei wird in Blöcke von beispielsweise 1024 oder 2048 Bytes aufgeteilt, und für jeden Block wird eine Prüfsumme berechnet.

Die neue Datei wird dann Byte für Byte nach Blöcken durchsucht, deren Prüfsummen denen der alten Version entsprechen. Hier ist ein Diagramm, das diesen Prozess veranschaulicht:

diffing 1

Wenn Sie diese Vorgänge für die neue Version der Datei wiederholen, werden Sie das Byte für Byte durchlaufen. Während dieser Iteration finden Sie zwei Datentypen in der Datei:

  • Datenblöcke, die mit Blöcken in der alten Datei übereinstimmen.
  • Bytefolgen, die nicht Teil eines übereinstimmenden Blocks sind.

Von RSync - Erkennen von Dateidifferenzen von Jakob Jenkov .

Bei Interesse finden Sie im nächsten Abschnitt die verwendeten Prüfsummen . Der Hauptpunkt der Prüfsumme ist jedoch, dass sie auf Bytes angewendet wird und Ihre Dateien aufgrund der Zeilenenden unterschiedliche Bytes aufweisen . Als solche rsyncerkennt sie richtig, dass sie unterschiedlich sind, und überträgt sie auch.

Vermeiden Sie das Übertragen von Dateien mit unterschiedlichen Zeilenenden, indem Sie die Pre-Übertragung desinfizieren

Das Beste, um dies zu tun, ist sicherzustellen, dass alle Ihre Dateien konsistente Zeilenenden haben oder diese bereinigen, wie Kamil in den Kommentaren vorgeschlagen hat.

Wie Sie das tun, liegt bei Ihnen. Sie können entscheiden, dass Sie die Änderung vornehmen, wenn die Dateien generiert, bearbeitet oder aktualisiert werden. Oder Sie können es als Vorübertragungsschritt tun.

Wenden Sie die Bereinigung nur auf die benötigten Dateien an

Wenn Sie saniert werden, stellen Sie sicher, dass Sie es nicht blind anwenden, da Kamil weiter warnt:

Man sollte kein Konvertierungswerkzeug blind für alle Dateien verwenden. Selbst wenn das Tool versucht zu erraten, ob eine Datei Text oder Binärdatei ist, handelt es sich nur um Heuristiken. CRLF wird möglicherweise in einer Binärdatei angezeigt. Blöcke, die wie Text aussehen, können ebenfalls angezeigt werden. Wenn Sie eine binäre Datei durch Entfernen einiger Bytes ändern, wird sie höchstwahrscheinlich beschädigt .

(Hervorhebung meines)

Wenn Sie beispielsweise Dateien in den beiden Verzeichnissen haben, von denen Sie wissen, dass es sich um Textdateien handelt, die bereinigt werden müssen, wenden Sie den Desinfektionsschritt nur auf diese Teilmenge an.

Welches Werkzeug sollte ich verwenden, um die Endungen zu ändern?

Eine vollständige Lösung liegt nicht im Rahmen dieser Antwort. Es gibt mehrere Vorschläge über auf dieser SO QA, einschließlich dos2unix, tr, sed, awk, perl.

Zum Beispiel:

Sie können trvon DOS nach Unix konvertieren. Sie können dies jedoch nur sicher durchführen, wenn CR in Ihrer Datei nur als erstes Byte eines CRLF-Bytepaares angezeigt wird. Dies ist normalerweise der Fall. Sie verwenden dann:

tr -d '\015' <DOS-file >UNIX-file 

Wenn Sie dies jedoch häufig tun müssen (mehr als einmal, grob gesagt), ist es weitaus sinnvoller, die Konvertierungsprogramme (z. B. dos2unixund unix2dos, oder vielleicht dtouund utod) zu installieren und zu verwenden.

von Jonathan Lefflers Antwort .

Beachten Sie jedoch die obige Warnung, wenn Sie eines dieser Tools verwenden.

@ KamilMaciorowski sehr wahr; Ich habe mich gezwungen, spezifische Empfehlungen zu geben, da es für diese Frage nicht in Frage kommt, weil ich die Einrichtung von OP nicht kenne. Ich werde die Antwort jedoch auch mit Ihrer Warnung aktualisieren. bertieb vor 5 Jahren 0
Schöne antwort mann !! Pimp Juice IT vor 5 Jahren 0