Linux-Tutorial / Dateien mit diff und cmp vergleichen

Verwenden Sie diff, wenn Sie sehen müssen, welche Textzeilen sich geändert haben und wie, und cmp, wenn Sie wissen müssen, ob zwei Dateien Byte für Byte identisch sind. Beide geben im Allgemeinen den Exit-Status 1 zurück, wenn die Dateien unterschiedlich sind, im Unterschied zum Status 2 bei Problemen beim Vergleich. Diese Lektion erstellt zwei kleine Dateien und untersucht sowohl die Ausgabe als auch den Exit-Status.

Verwenden Sie die Lektion zum Lesen von Dateien, um Vergleichsdateien vorzubereiten und zu überprüfen. Ein diff-Status von 1 bedeutet, dass ein Unterschied gefunden wurde; unterscheiden Sie ihn von einem Betriebsfehler, wenn Sie bedingte Ausführung anwenden.

Bereiten Sie zwei Dateien zum Vergleichen vor

Die Übung geht davon aus, dass Bash und GNU Diffutils verwendet werden. Wenn ~/linux-course-13-practice existiert, wählen Sie einen anderen Verzeichnisnamen. Stoppen Sie, wenn das initiale mkdir fehlschlägt; die späteren > Befehle können vorhandene Dateien überschreiben.

mkdir ~/linux-course-13-practice
cd ~/linux-course-13-practice
pwd

Sobald Sie den Standort bestätigt haben, erstellen Sie die Dateien. Nur die zweite Zeile unterscheidet sich: beta versus BETA.

printf 'alpha\nbeta\ngamma\n' > old.txt
printf 'alpha\nBETA\ngamma\n' > new.txt

Geänderte Zeilen mit diff lesen

diff vergleicht Zeilen. -u wählt das Unified-Format, das auch nahegelegene unveränderte Zeilen enthält. GNU --label ersetzt die üblichen Datei-und-Zeit-Kopfzeilen durch stabile Labels für dieses Beispiel.

diff -u --label old --label new old.txt new.txt

Die Übungsdateien ergeben:

--- old
+++ new
@@ -1,3 +1,3 @@
 alpha
-beta
+BETA
 gamma

--- markiert die frühere Eingabe und +++ die spätere Eingabe. Der @@-Header identifiziert den Zeilenbereich. Eine Zeile, die mit - beginnt, stammt aus der ersten Datei, eine, die mit + beginnt, aus der zweiten, und eine, die mit einem Leerzeichen beginnt, ist unverändert. diff weiß nicht, welche Datei Sie als das echte Original betrachten: die Reihenfolge der Argumente legt die Vergleichsrichtung fest.

Finden Sie den ersten Byte-Unterschied mit cmp

cmp vergleicht Bytes und meldet normalerweise die Position des ersten Unterschieds. Hier ist das der erste Buchstabe der zweiten Zeile, nach alpha und seinem Zeilenumbruch.

cmp old.txt new.txt

Mit GNU cmp in einer englischen Locale kann die Nachricht wie old.txt new.txt differ: byte 7, line 2 aussehen. Die Formulierungen können sich mit Dateinamen und Locale ändern, aber der Punkt ist, dass der erste Unterschied in Zeile zwei liegt. cmp listet nicht jede spätere Abweichung auf.

Für eine stille Gleichheitsprüfung, füge -s hinzu und prüfe sofort den Exit-Status. Da diese Dateien unterschiedlich sind, wird 1 ausgegeben. $? bezieht sich auf den zuletzt ausgeführten Befehl; das Einfügen eines anderen Befehls zwischen den beiden Zeilen würde ändern, was er meldet.

cmp -s old.txt new.txt
echo $?

Unterscheide Unterschiede von Fehlern

Exit-Status Übliche Bedeutung für diff und cmp Was zu prüfen ist
0 Kein Unterschied gefunden Bestätigen Sie, dass Sie die vorgesehenen Eingaben verglichen haben
1 Dateien unterscheiden sich Lesen Sie die diff-Ausgabe für geänderten Text
2 Probleme, wie eine nicht lesbare Datei Pfad, Berechtigung und Fehlermeldung

cmp eignet sich gut für den Vergleich der Byte-Gleichheit; diff -u ist besser geeignet, um eine Textänderung zu verstehen. Unterschiedliche Zeilenenden oder Kodierungen können Unterschiede erzeugen, selbst wenn der Text ähnlich aussieht. Bei einer Binärdatei kann ein Textvergleich nicht hilfreich sein, daher beginnen Sie mit cmp, wenn die exakte Identität die Frage ist. GNU diff -r kann Verzeichnisbäume vergleichen, aber prüfen Sie zunächst die Pfade, da dies den Umfang des Vergleichs erweitert.

Offizielle Dokumentation

Das GNU Diffutils-Handbuch dokumentiert die einheitliche Ausgabe, cmp, und die Exit-Status beider Befehle.