cmp

Porównuje dwa pliki bajt po bajcie i wskazuje pierwszą różnicę.

cmp to minimalistyczne narzędzie z pakietu GNU diffutils, które porównuje dwa pliki bajt po bajcie i mówi Ci, gdzie pojawia się pierwsza różnica — podaje numer bajtu i numer linii. W odróżnieniu od diff nie pokazuje „co” się różni linijka po linijce, tylko stwierdza fakt: pliki są identyczne albo różnią się od konkretnego miejsca. Dlatego świetnie nadaje się do plików binarnych (obrazy, archiwa, skompilowane programy), gdzie diff i tak nic sensownego nie wypisze. Domyślnie cmp jest cichy jak grób: jeśli pliki są takie same, nie powie nic i zwróci kod wyjścia 0.

Składnia i najważniejsze opcje

Podstawowa forma: cmp [OPCJE] PLIK1 PLIK2 [SKIP1 [SKIP2]]

  • -b, --print-bytes — wypisuje wartości różniących się bajtów (znaki sterujące pokazuje jako ^X).
  • -l, --verbose — wypisuje numery i wartości wszystkich różniących się bajtów, a nie tylko pierwszego.
  • -s, --quiet, --silent — wyłącza całe wyjście; interesuje Cię tylko kod powrotu (idealne do skryptów).
  • -n LIMIT, --bytes=LIMIT — porównuje najwyżej LIMIT bajtów i kończy.
  • -i SKIP, --ignore-initial=SKIP — pomija pierwsze SKIP bajtów obu plików; w formie SKIP1:SKIP2 pomija osobno w każdym pliku.
  • --help — szybka ściąga z opcjami, --version — wersja narzędzia.

Wartości LIMIT i SKIP przyjmują mnożniki, np. K (1024), kB (1000), M, MB, G.

Przykłady użycia

  • cmp plik1.txt plik2.txt — najprostsze porównanie; jeśli się różnią, dostaniesz np. plik1.txt plik2.txt różnią się: bajt 42, wiersz 3.
  • cmp -s a.bin b.bin && echo "identyczne" — tryb cichy w skrypcie: reagujesz tylko na kod wyjścia, bez śmieci na ekranie.
  • cmp -l obraz1.iso obraz2.iso — wypisuje wszystkie różniące się bajty (pozycja i wartości ósemkowo), przydatne do oceny skali rozjazdu.
  • cmp -b config.old config.new — pokazuje pierwszy różniący się bajt razem z jego znakiem, więc od razu widzisz, co tam siedzi.
  • cmp -i 512 dysk1.img dysk2.img — pomija pierwsze 512 bajtów (np. nagłówek/sektor rozruchowy) i porównuje resztę.

Częste błędy i pułapki

Kod wyjścia ma trzy znaczenia i warto je znać: 0 = pliki identyczne, 1 = różnią się, 2 = błąd (np. brak pliku albo brak uprawnień). W skryptach nie traktuj więc każdego „niezerowego” wyniku jako „pliki różne” — 2 to coś zupełnie innego. Druga pułapka: cmp uznaje krótszy plik za „różny”, jeśli jest prefiksem dłuższego — wypisze ostrzeżenie EOF on FILE1. Pamiętaj też, że -l drukuje wartości bajtów ósemkowo, nie dziesiętnie — łatwo się nadziać przy ręcznym liczeniu. Na macOS/BSD dostajesz wersję BSD z węższym zestawem opcji niż GNU; jeśli potrzebujesz --ignore-initial z dwoma wartościami, sięgnij po gcmp z coreutils/diffutils zainstalowanych przez Homebrew.

Powiązane komendy: diff (różnice tekstowe linia po linii), diff3 (trzy pliki naraz), comm (porównanie posortowanych linii), md5sum i sha256sum (porównanie po sumie kontrolnej), od i xxd (podgląd zawartości binarnej).