Команда cmp

Команда 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