Как лучше всего сравнивать структуры каталогов?
У меня есть утилита резервного копирования, которая использует rsync. Я хочу указать точные различия (с точки зрения размеров файлов и дат последнего изменения) между источником и резервной копией.
Что-то вроде:
Local file Remote file Compare
/home/udi/1.txt (date)(size) /home/udi/1.txt (date)(size) EQUAL
/home/udi/2.txt (date)(size) /home/udi/2.txt (date)(size) DIFFERENT
Конечно, это может быть готовый инструмент или идея скрипта на Python.
Большое спасибо!
Уди
Инструмент, который вы ищете, rdiff. Это работает как сочетание rsync и diff. Он создает файл исправления, который вы можете сравнивать или распространять.
Некоторые люди хотят сравнить файловые системы по разным причинам, поэтому я напишу здесь, что я хотел и как я это сделал.
Первый снимок (before.sh
скрипт):
find / -xdev | sort > fs-before.txt
Второй снимок (after.sh
скрипт):
find / -xdev | sort > fs-after.txt
Чтобы сравнить их (diff.sh
скрипт):
diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'
Хорошая часть состоит в том, что здесь используются системные двоичные файлы по умолчанию. Сравнение на основе содержимого может быть выполнено с помощью find
ан -exec
параметр, который повторяет путь к файлу и MD5 после этого.
если вам не хочется устанавливать другой инструмент ...
for host in host1 host2
do
ssh $host '
cd /dir &&
find . |
while
read line
do
ls -l "$line"
done ' | sort > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"
И да, это можно сделать с помощью find и exec или find и xargs так же легко, как find в цикле for. Кроме того, вы можете улучшить вывод команды diff, чтобы она говорила что-то вроде «этот файл находится на host1, но не host2» или что-то подобное, но в этот момент вы можете просто установить инструменты, о которых все говорят ...
Я использовал dirdiff в прошлом для сравнения структур каталогов. Он работает только с локальными каталогами, поэтому вам придется sshfs
-монтируйте другие ваши каталоги.
Хорошо то, что вы можете визуально увидеть, равны ли файлы или нет, и какой из них новее или старше. И он поддерживает до 5 каталогов. Вы также можете видеть различия и копировать файлы из одного в другой.
На странице руководства rsync:
-n, --dry-run
This makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run). It is most commonly used in combination with the -v,
--verbose and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.
Может, это поможет.
diff -r
на самом деле работает довольно хорошо. Если вы просто хотите знать, различаются ли файлы, а не фактическое содержимое различий, выполните diff -qr
Я бы использовал для этого Meld.
Помимо инструментов, уже упомянутых в Windows, вы можете использовать Total Commander или WinSCP, оба имеют очень удобные функции для сравнения (и синхронизации) каталогов.
Я не особо хотел устанавливать что-то новое, поэтому мое решение несколько грубоватое, но быстрое и эффективное.
Я хотел сравнить, что все файлы были скопированы, а их файловый режим, права собственности и контекст безопасности SELinux остались неизменными.
Итак, я побежал:
rsync -aX /orig /copy/
а затем сравните вот так:
cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*
Если содержимое обоих файлов остается свернутым, значит, они идентичны. В противном случае отображается разница.
Обновить параметры ls
чтобы отразить атрибуты, которые необходимо проверить. YMMV