Довольно тривиальная задача по сравнению всех или некоторых файлов из разных каталогов, встречается весьма часто. Но вот уже в который раз я сталкиваюсь с тем, что для некоторых людей она становится настоящим камнем преткновения. Иной раз можно услышать и весьма оригинальные идеи, например идею сравнивать даты файлов, размер и даже хэш суммы. Не спорю, в некоторых случаях эти методы могут оказать неоцениму помощь. Но случается так, что нужно сравнить несколько версий файлов, созданных в одно время, в этом случае, самый доступный (потому-что доступен через графический интерфейс) метод - сравнения дат, не сработает. Если же случалась замена одного и того же количества символов в сравниваемых файлах то и метод определения разницы размера файлов так же не сработает. Что же, остаётся весьма надёжный метод сравнения хэш сумм, но представьте, что сравниваемые файлы имеют длинну в несколько тысяч строк, а искомое различие составляет лишь несколько символов. Факт знания чтого что файлы различны, даст нам направления поиска, но отыскать сами различия будет также просто, как отыскать иголку в стоге сена. А ведь между тем, ничего придумывать и не надо! Всё давным давно изобретено, знакомьтесь - команда diff !
Вот несколько очень типичных примеров её использования:
Пример 1:
Простое построчное сравнение двух файлов, узнаём чем они отличаются:
Пример 2:
Нужно сравнить все файлы каталога, работающего сайта с одноименными файлами тестового каталога (надеюсь вы не имеете привычки вносить какие-либо изминения, непосредственно, сразу, в ваш рабочий web-проект?).
Решение очень простое:
Здесь мы использовали дополнительный ключ “-r“, который задаёт рекурсивность для папок, т.е. находя папку, команда diff перходит в неё и просматривает содержащиеся там файлы. Находя файлы с одинаковыми именами и относительными путями в обеих папках, diff сравнивает содержимое файлов.
Пример 3:
Необходимо сравнить все файлы в одинаковых каталогах (как в примере 2), но в этот раз мы хотим избежать того, чтобы diff сравнивала наши гигансткие, многомегабайтные логи webstat, так-как сравнение логов может сильно загромоздить вывод, ненужным массивом данных.
Вот решение:
Используя ключ “-x” мы исключаем из поиска файлы (папки) совпадающие с указанным нами именем - webstat. Найдя такой файл или папку, diff игнорирует их, а мы получаем удобочитаемые вывод команды, незагромажденный лишними данными. Не стоит забывать и о том, что вывод diff, обычно, удобнее направлять в файл, где с данными будет работать намного удобнее:
Ну и напоследок! Не забывайте читать хелпы и маны: