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 formieSKIP1:SKIP2pomija 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).