Skip to content

Home Администрирование Сравнение данных
Сравнение данных

Сравнение данных - очень важная операция для системного администратора. Вы часто могли задавать себе вопросы: «Какие файлы в этих двух каталогах различны? Сколько копий одного и того же файла существует у меня в системе?» В этом разделе вы найдете способы, которые позволят вам ответить на эти и другие вопросы.

Когда приходится иметь дело с огромными объемами важных данных, часто бывает необходимо сравнить деревья каталогов и файлов, чтобы узнать, какие изменения были внесены. Это становится еще более важным, когда дело доходит до создания сценариев, перемещающих данные. Судный день будет вам гарантирован, если ваш сценарий перемещения больших объемов данных повредит какие-либо критически важные данные.

В этом разделе мы сначала исследуем несколько легковесных методов сравнения файлов и каталогов, а затем перейдем к вычислению и сравнению контрольных сумм файлов. В стандартной библиотеке языка Python имеется несколько модулей, которые помогут выполнить сравнение; мы рассмотрим filecmp и os.llstdir.

Использование модуля filecmp

Модуль filecmp содержит функции для быстрого и эффективного сравнения файлов и каталогов. Модуль filecmp вызывает функцию os. stat() для двух файлов и возвращает значение True, если результаты вызова os. stat() одни и те же для обоих файлов, и False, если полученные результаты отличаются. Обычно функция os.stat() вызывается, чтобы определить, не используют ли два файла одни и те же индексные узлы на диске и не имеют ли они одинаковые размеры, но сравнение содержимого файлов при этом не производится.

Чтобы полностью понять, как работает модуль filecmp, нам потребуется создать три файла. Для этого перейдем в каталог /imp, создадим файл с именем file0.txt и запишем в него «О». Затем создадим файл с именем filel.txt и запишем в него «1». Наконец, создадим файл с именем fileOO.txt и запишем в него «О». Эти файлы будут использоваться в качестве объектов сравнения в следующем фрагменте:

Как видите, функция стр() вернула значение True при сравнении файлов file0.txt и fileOO.txt, и False при сравнении файлов filel.txt и file0.txt.

Функция dircmp() имеет множество атрибутов, которые сообщают о различиях между двумя деревьями каталогов. Мы не будем рассматривать каждый атрибут, но продемонстрируем несколько примеров выполнения действий, которые могут быть вам полезны. Для этого примера в каталоге /tmp были созданы два подкаталога, в каждый из которых были скопированы файлы из предыдущего примера. В каталоге dirь был создан дополнительный файл с именем filell.txt, в который была записана строка «11»:

Возможно, вас удивило, что атрибут diff_files не содержит ничего, хотя мы создали файл filell.txt с уникальной информацией в нем. Дело в том, что атрибут diff_flies выявляет различия только между одноименными файлами.

Затем взгляните на результат вывода атрибута same_files и обратите внимание, что он сообщает об идентичных файлах в двух каталогах. Наконец, в последнем примере был сгенерирован отчет. Он наглядно сообщает о различиях между двумя файлами. Это был лишь очень краткий обзор возможностей модуля filecmp, поэтому мы рекомендуем обратиться к документации в стандартной библиотеке языка Python, чтобы получить полное представление о имеющихся возможностях, для описания которых мы не располагаем достаточным пространством.

Использование os . llstdir

Еще один легковесный способ сравнения двух каталогов основан на использовании метода os.llstdir(). Метод os.llstdir() можно представлять себе как аналог команды ls - он возвращает список обнаруженных файлов. Язык Python поддерживает множество интересных способов работы со списками, поэтому вы можете использовать метод os.llstdir() для выявления различий между каталогами, просто преобразуя списки во множества и затем вычитая одно множество из дPyroго. Ниже показано, как это делается в оболочке IPython:

В этом примере можно видеть, что мы преобразовали два списка во множества, а затем выполнили операцию вычитания, чтобы выявить различия. Обратите внимание, что в строке [7] было получено имя f ilel 1. txt, потому что di rь является надмножеством для di гА, но в строке [6] был получен пустой результат, потому что множество dirA содержит элементы, которые содержатся в множестве di гВ. При использовании множеств легко можно создать простое объединение двух структур данных, вычитая полные пути в одном каталоге из путей в дPyroм каталоге, и копируя найденные различия. Объединение данных мы рассмотрим в следующем разделе.

Однако этот подход имеет существенные ограничения. Фактическое имя файла часто может вводить в заблуждение, поскольку ничто не мешает иметь файл с нулевым размером, имя которого совпадает с именем файла, имеющим размер 200 Гбайт. В следующем разделе мы представим несколько лучший способ обнаружения различий между каталогами и объединения их содержимого.

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top