Команда cmp позволяет использовать утилиту для побайтового сравнения двух произвольных файлов. Она может использоваться как для сравнения бинарных, так и для сравнения текстовых файлов. В случае текстовых файлов для улучшения информативности вывода могут использоваться дополнительные параметры.
Базовый синтаксис команды выглядит следующим образом:
$ cmp [параметры] <первый файл> <второй файл>
По умолчанию утилита выводит информацию о позиции первого отличающего байта, либо сообщение о том, что файлы являются идентичными. При обработке текстовых файлов следует использовать параметр -c, активирующий режим обработки байтов как текстовых символов. Для вывода позиций и значений всех отличающихся байтов в первом и во втором файле предназначен параметр -l, причем вместе с ним может использоваться параметр -n с числовым значением, соответствующим максимальному количеству искомых различий.
Если необходимо пропустить заданное количество байт в начале каждого из файлов, может использоваться параметр -i, требующий обязательного указания количества пропускаемых байтов в обоих файлах, либо в каждом из файлов по отдельности, но в этом случае значения должны отделяться с помощью символа двоеточия. Для использования утилиты из сценариев без вывода каких-либо сообщений может использоваться параметр -s, причем результат сравнения может быть получен из кода завершения работы утилиты (0 — файлы идентичны, 1 — файлы отличаются, 2 — ошибка доступа или недопустимый аргумент).
В качестве тестовых файлов для сравнения будут использоваться текстовые файлы со следующим содержимым:
$ cat file1.txt
Linux FAQ cmp command tutorial
$ cat file2.txt
linux faq man command tutorial
Для поиска первого отличающегося байта в двух файлах не нужно использовать каких-либо параметров:
$ cmp file1.txt file2.txt
file1.txt file2.txt различаются: байт 1, строка 1
В случае обработки текстовых файлов рекомендуется использовать параметр -c; благодаря ему утилита выведет не только позицию отличающегося байта, но и его значения в обоих файлах, а также соответствующие им символы:
$ cmp -c file1.txt file2.txt
file1.txt file2.txt различаются: байт 1, строка 1 равен 114 L 154 l
Для поиска всех различий в файлах следует использовать параметр -l. Вы увидите таблицу в первом столбце которой будет находится позиционный номер отличающегося байта, во втором — его значение из первого файла, а в третьем — его значение из второго файла. Другими словами, без параметра -c утилита будет выводить лишь значения отличающихся байтов:
$ cmp -l file1.txt file2.txt
1 114 154
7 106 146
8 101 141
9 121 161
11 143 155
12 155 141
13 160 156
Параметр -c в данном случае будет действовать аналогичным образом, причем немного изменится формат вывода: в первом столбце таблицы будет находиться позиционный номер отличающегося байта, во втором и третьем — его значение и соответствующий символ из первого файла, а в четвертом и пятом — его значение и соответствующий символ из второго файла:
$ cmp -l -c file1.txt file2.txt
1 114 L 154 l
7 106 F 146 f
8 101 A 141 a
9 121 Q 161 q
11 143 c 155 m
12 155 m 141 a
13 160 p 156 n
Для осуществления поиска различий с определенных позиций используется параметр -i. В данном случае осуществляется пропуск 10 байтов с начала каждого из файлов:
$ cmp -l -c -i 10:10 file1.txt file2.txt
1 143 c 155 m
2 155 m 141 a
3 160 p 156 n