Как сравнить и найти отличия всех файлов в одинаковых каталогах?

Довольно тривиальная задача по сравнению всех или некоторых файлов из разных каталогов, встречается весьма часто. Но вот уже в который раз я сталкиваюсь с тем, что для некоторых людей она становится настоящим камнем преткновения. Иной раз можно услышать и весьма оригинальные идеи, например идею сравнивать даты файлов, размер и даже хэш суммы. Не спорю, в некоторых случаях эти методы могут оказать неоцениму помощь. Но случается так, что нужно сравнить несколько версий файлов, созданных в одно время, в этом случае, самый доступный (потому-что доступен через графический интерфейс) метод -  сравнения дат, не сработает. Если же случалась замена одного и того же количества символов в сравниваемых файлах то и метод определения разницы размера файлов так же не сработает. Что же, остаётся весьма надёжный метод сравнения хэш сумм, но представьте, что сравниваемые файлы имеют длинну в несколько тысяч строк, а искомое различие составляет лишь несколько символов.  Факт знания чтого что файлы различны, даст нам направления поиска, но отыскать сами различия будет также просто, как отыскать иголку в стоге сена. А ведь между тем, ничего придумывать и не надо! Всё давным давно изобретено, знакомьтесь - команда diff !

Вот несколько очень типичных примеров её использования:

Пример 1:

Простое построчное сравнение двух файлов, узнаём чем они отличаются:

$ diff file1 file2

Пример 2:

Нужно сравнить все файлы каталога, работающего сайта с одноименными файлами тестового каталога (надеюсь вы не имеете привычки вносить какие-либо изминения, непосредственно, сразу, в ваш рабочий web-проект?).

Решение очень простое:

$ diff -r var/www/site/somesite.ru /var/www/testsite/somesite.ru

Здесь мы использовали дополнительный ключ “-r“, который задаёт рекурсивность для папок, т.е. находя папку, команда diff перходит в неё и просматривает содержащиеся там файлы. Находя файлы с одинаковыми именами и относительными путями в обеих папках, diff сравнивает содержимое файлов.

Пример 3:

Необходимо сравнить все файлы в одинаковых каталогах (как в примере 2), но в этот раз мы хотим избежать того, чтобы diff сравнивала наши гигансткие, многомегабайтные логи webstat, так-как сравнение логов может сильно загромоздить вывод, ненужным массивом данных.

Вот решение:

$ diff -r -x webstat var/www/site/somesite.ru /var/www/testsite/somesite.ru

Используя ключ “-x” мы исключаем из поиска файлы (папки) совпадающие с указанным нами именем - webstat. Найдя такой файл или папку, diff игнорирует их, а мы получаем удобочитаемые вывод команды, незагромажденный лишними данными. Не стоит забывать и о том, что вывод diff, обычно, удобнее направлять в файл, где с данными будет работать намного удобнее:

$ diff -r -x webstat var/www/site/somesite.ru /var/www/testsite/somesite.ru > my_result_file.txt

Ну и напоследок! Не забывайте читать хелпы и маны:

$ diff –help
$ man diff

Оставьте отзыв!

You must be logged in to post a comment.