Grundsätzlich müssen Sie zwei Dateien vergleichen und das nachfolgende Byte unter bestimmten Bedingungen ignorieren. Es gibt keine "diff" -Option, aber es gibt eine Reihe von Möglichkeiten, wie dies gemacht werden kann (z. B. kommt auch hex diff in den Sinn).
Um 'diff' zu verwenden, müssen Sie im Grunde genommen die Dateien ändern, denen die Zeilenumbruchzeile am Ende einer Datei fehlt, und dann vergleichen. Sie können ein temporäres Verzeichnis mit den geänderten Dateien erstellen oder mit ein wenig Skripting im Speicher ausführen. (Was bevorzugt wird, hängt von der Präferenz, der Dateigröße, der Anzahl der Dateien ... ab.)
Beispiel: Der folgende Befehl ändert den Inhalt einer Datei (wird verwendet sed -i
, um sie an Ort und Stelle zu ändern. Dies wird nur auf stdout gedruckt.), Um eine neue Zeile hinzuzufügen, falls eine fehlt (oder die Datei unverändert zu lassen, falls bereits eine neue Zeile vorhanden ist):
sed -e '$a\' file1.txt
Und nur um die 'diff'-Syntax zu überprüfen (true bedeutet, dass sie gleich sind, false bedeutet anders):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
Stellen Sie sicher, dass nur Leerzeichen unterschiedlich sind:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
In bash können wir 'sed' verwenden, um den Dateiinhalt so zu bearbeiten, wie er an 'diff' übergeben wird (Originaldateien bleiben unverändert):
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
Jetzt müssen Sie nur noch emulieren diff -r
, um Verzeichnisse rekursiv zu vergleichen. Wenn Sie Verzeichnisse a
und vergleichen b
, leiten Sie für alle Dateien in a
(z. B. a/dir1/dir2/file.txt
) den Pfad zur Datei in b
(z. B. b/dir1/dir2/file.txt
) ab und vergleichen Sie:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
Eine etwas ausführlichere Version:
$ for f in $( find a -type f )
> do
> f1=$f
> f2=b/${f#*/}
> echo "compare: $f1 $f2"
> diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \
> && echo '** are same' || echo '** are different'
> done && echo '** all are same' || echo '** all are different'
compare: a/file1.txt b/file1.txt
** are same
compare: a/file2.txt b/file2.txt
** are same
** all are same
sed -e '$a\'
genau funktioniert? thx