Linux / Befehl cmp: Dateien Byte für Byte vergleichen

Der cmp-Befehl vergleicht zwei Dateien Byte für Byte. Standardmäßig stoppt er beim ersten Unterschied und meldet dessen Byte- und Zeilenposition, was ihn nützlich für schnelle Gleichheitsprüfungen und das Auffinden des frühesten Unterschieds macht.

Ergänzende Befehle und Anwendungsfälle finden Sie in Essenzielle Linux-Befehle: Ein praktisches Nachschlagewerk nach Aufgabe.

Was ist der cmp-Befehl?

Cmp liest beide Eingaben von Anfang an und beendet sich still mit Status 0, wenn die verglichenen Bytes identisch sind. Ein Unterschied erzeugt normalerweise Status 1, während ein Eingabe- oder Ausführungsproblem Status 2 erzeugt. Für Menschen lesbare Zeilenänderungen in Text ist diff normalerweise informativer.

Grundlegende Syntax

cmp [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]

Optionen und Randfälle können je nach Implementierung und Version variieren. Überprüfen Sie cmp --help und man cmp auf dem Zielsystem, bevor Sie sich auf implementierungsspezifisches Verhalten verlassen.

Grundlegende cmp-Verwendung

Vergleiche zwei Dateien

Wenn die Dateien unterschiedlich sind, erkennt die Standardausgabe den ersten Unterschied.

cmp image-a.bin image-b.bin

Gleichheit still prüfen

Verwenden Sie -s und prüfen Sie den Exit-Status in einem Skript.

cmp -s copy.iso original.iso

Vergleichen Sie nur einen Anfangsbereich

GNU cmp akzeptiert -n, um die Anzahl der gelesenen Bytes zu begrenzen.

cmp -n 4096 file-a file-b

Lesen Sie die erste unterschiedliche Byte-Position

cmp vergleicht zwei Dateien Byte für Byte und zeigt Ihnen die erste unterschiedliche Position. Wenn die Dateien identisch sind, gibt es im Grunde nichts aus.

printf 'A' > first.bin
printf 'B' > second.bin
cmp first.bin second.bin

Beispielausgabe (Formulierungen können je nach Implementierung variieren):

first.bin second.bin differ: byte 1, line 1

Der Exit-Status 1 bedeutet, dass es einen Unterschied gibt, 2 weist auf Probleme wie Lesefehler hin. Wenn Sie keine Bildschirmausgabe in einem Skript wünschen, verwenden Sie cmp -s und überprüfen Sie den Exit-Status.

Wichtige Optionen

Option Zweck
-s, --silent Unterdrücke die normale Ausgabe und verwende nur den Exit-Status.
-l, --verbose Drucke die Position und Werte jedes unterschiedlichen Bytes.
-b, --print-bytes Drucke unterschiedliche Bytes in einer darstellbaren Form.
-i SKIP Überspringe eine Anfangsanzahl von Bytes in beiden Eingaben.
-i SKIP1:SKIP2 Unter GNU-Systemen verwende unterschiedliche Überspringmengen für die Eingaben.
-n LIMIT Vergleiche nicht mehr als LIMIT Bytes.

Praktische Beispiele

In einem Skript nach Gleichheit verzweigen

Verwenden Sie den Exit-Status anstelle des Parsens lokalabhängiger Diagnosetexte.

if cmp -s generated.conf current.conf; then
  printf '%s\n' 'No change'
else
  printf '%s\n' 'Files differ'
fi

Einen festen Header-Bereich vergleichen

Begrenzen Sie den Vergleich, wenn ein Dateiformat eine bekannte Header-Größe hat.

cmp -n 512 disk-a.img disk-b.img

Container-Header überspringen

Verwenden Sie eine unterstützte Überspring-Form, wenn nur der Payload nach einem festen Offset verglichen werden soll.

cmp -i 4096 payload-a.bin payload-b.bin

cmp und verwandte Befehle

Befehl Hauptrolle Geeignet für
cmp Erste Abweichung auf Byte-Ebene Gleichheit und Offset-Diagnose
diff Textänderungen auf Zeilenebene Lesbarer Textvergleich
sha256sum Unabhängige Datei-Prüfsummen Überprüfung aus der Ferne oder von vielen Dateien
comm Vergleich sortierter Zeilensätze Gemeinsame und einzigartige Einträge

Wichtige Hinweise

Detaillierte Ausgaben können sehr umfangreich sein

Wenn sich eine große Datei durchgehend unterscheidet, kann -l für jedes geänderte Byte eine Zeile ausgeben.

Unterschied von Problemen unterscheiden

Status 1 bedeutet unterschiedlich; Status 2 kann einen Lesefehler, fehlende Eingabe oder ungültigen Aufruf bedeuten.

Byte-Gleichheit ist keine Authentizität

Cmp zeigt, dass die verglichenen Bereiche übereinstimmen; es überprüft nicht Ursprung, Signatur oder Dateiformatgültigkeit.

FAQ

Bedeutet keine Ausgabe, dass die Dateien gleich sind?

Wenn cmp mit Status 0 erfolgreich abgeschlossen wurde, sind die verglichenen Bereiche Byte für Byte gleich.

Wie zeige ich jeden Unterschied an?

Verwenden Sie cmp -l FILE1 FILE2, aber erwarten Sie große Ausgaben, wenn die Unterschiede zahlreich sind.

Kann cmp Textdateien vergleichen?

Ja, aber diff zeigt geänderte Zeilen lesbarer an.

Wie unterscheidet sich cmp von einer Prüfsumme?

Cmp liest zwei Eingaben zusammen, während Prüfsummen unabhängige Digests erzeugen, die über Maschinen oder Zeiträume hinweg praktisch sind.

Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter GNU Diffutils cmp Dokumentation.