Es gibt keine Option, die Zeilenenden für zu ignorieren rsync
Wie Sie herausgefunden haben, sind rsync
Dateien mit unterschiedlichen Zeilenenden unterschiedlich. Dies ist in Ihrer Situation unbequem, da die Dateien visuell / semantisch gleich sind.
rsync
entscheidet, 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:
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 rsync
erkennt 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
tr
von 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.
dos2unix
undunix2dos
, oder vielleichtdtou
undutod
) zu installieren und zu verwenden.
von Jonathan Lefflers Antwort .
Beachten Sie jedoch die obige Warnung, wenn Sie eines dieser Tools verwenden.