Рецепты доктора Брауна
Утилиты сравнения файлов Рассмотрим опции Linux и узнаем, зачем сравнивать файлы.
В
Представление файлов в Meld лицом к лицу визуально подво дит к различиям.
Linux довольно много утилит сравнения файлов – выходит, люд ям оно нужно. Но зачем? Ну, например, кто-то взял да отредактировал ваш роман, и вы хотите оценить при чиненный ущерб. Если у вас сохранилась копия оригинала, срав нение файлов быстро выявит различия. Или – у вас рабочая кон фиг урация Apache на одном компьютере и нерабочая на другом. Сравнение файлов настройки прольет свет на причину сбоя. Ес ли вы программист и трудитесь над версией 1.4 своего шедевра, утилиты сравнения файлов подскаж ут, насколько она выросла по сравнению с 1.3. К этому случаю близок такой: нужно объеди нить два файла, отошедших от общего предка. Сравнение фай лов поможет определить предварительные изменения, необходи мые для слияния. Как мы увидим, в некоторые утилиты сравнения файлов встроена и функция слияния файлов. Вывод командной строки утилит сравнения файлов (который можно представить как набор изменений, необходимых для пре вращения старой версии файла в новую) можно использовать для создания файла заплатки. Такие файлы часто называют «diffs» в честь классической утилиты командной строки. Например, на сайте ядра Linux (www.kernel.org) есть заплатки для обновления исходного кода одной версии ядра Linux до следующей. Чтобы за грузить их, не нужно столько трафика, сколько для загрузки пол ных исходных кодов ядра. Аналогично, разработчики ядра от правляют свои обновления в виде заплат. Итак, разобравшись с мотивацией, займемся простой утили той сравнения CMP – она существует с начала эры Unix и работает с файлами любого типа. По сути, она побайтно сравнивает фай лы и сообщает, где находится первое различие. У нее есть флаг (-l), который отображает все различия, но не пытается синхрони зировать содержимое: например, если удален всего один байт, различными окаж утся все остальные байты в файлах. В молчали вом режиме (опция -s) утилита просто возвращает стат ус выхода (ноль – если файлы одинаковы, и не ноль, если нет), и ею удобно пользоваться в скриптах оболочки – например, так: if cmp -s foo bar then echo foo and bar are identical fi Перейд я от одной крайности к другой, расмотрим лучшую графическую утилит у сравнения файлов – Meld (http://meld. sourceforge.net). Она написана на Python. Выше приведен экран ный снимок Meld со сравнением двух версий файла /etc/fstab. Вглядевшись повнимательнее, вы увидите, что в новой версии добавлена строка комментария, одна строка удалена, а третья
56 LXF139/140 Январь 2011
Meld 1.4.0
А если это не текст? Утилиты, о которых мы говорили, работают только с текстовыми фай лами, и их поле деятельности пугающе сужается при переходе к фай лам других типов. В OpenOffice.org пред усмотрено сравнение док у ментов. Двустороннего представления док ументов нет, но различия отмечаются встроенной разметкой. Док ументы не сравниваются пол ностью: вы скачете от одного изменения к другому, принимая или от клоняя каж дое; однако нередки ошибки определения минимально достаточного набора различий – часто помечается пол-абзац а, когда различие всего в несколько слов. Это поведение показано внизу спра ва на смежной странице. Для сравнения изображений имеются утилиты, определяющие дубликаты в вашей коллекции фотографий, но все они, кажется, для Windows. Порывшись, я обнаружил программу под названием Perceptualdiff, которая работает в Linux и использует «вычислитель ную модель визуа льной системы человека» для определения ви димого различия меж д у двумя изображениями (поддерживаются форматы TIFF и PNG). Можно задать несколько параметров (указав чувствительность сравнения) и получить простой результат «одина ковы/неодинаковы» (PASS/FAIL): $ perceptualdiff screenshot1.png screenshot2.png FAIL: Images are visibly different 114 pixels are different Нечто большее, наверное, уже за пределами интеллекта ком пьютера.
строка чуть изменилась. Визуа льное удобство Meld в отображе нии различий ясно из снимка, но у него есть и другие, не столь очевидные возможности. Например, затененные полоски по краям, справа и слева, пока зывают, где именно наход ятся различия внутри файла. Конечно, это полезнее на более длинных файлах, чем показанный здесь. Также дост упна цветовая подсветка синтаксиса с GtkSourceView (как в Gedit). Другая приятная мелочь – файлы можно редактиро вать прямо в Meld, а diffs буд ут обновляться автоматически. Есть и другие графические утилиты сравнения файлов в том же стиле – например, Tkdiff (см. снимок вверх у справа или на сай те http://sourceforge.net/projects/tkdiff), менее глянцевый, чем Meld, или Xxdiff (даже менее глянцевый, чем Tkdiff) и Kompare из KDE, который здорово выглядит на своем сайте (www.caffeinated. me.uk/kompare), но привести его в рабочее состояние, чтобы сде лать снимок, было непросто. В более дешевом сегменте рынка, по крайней мере в смысле визуа льной привлекательности, классическая утилита сравнения файл ов – это diff. Пос мотр им, как она предс тав ит изм ен ен ия в тех же двух файлах fstab: $ diff fstab.old fstab.new 1a2 > # Home directories on separate drive 4d4 < /dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0 6c6 < /dev/hda1 swap swap pri=42 0 0 --> /dev/hda1 swap swap defaults 0 0 Изменения в diff помечены буквами a (добавлено), d (удалено) и c (изменено). Числа относятся к номерам строк в файлах сле ва и справа. Таким образом, 6c6 означает, что изменение было,