Назад | Перейти на главную страницу

Лучший способ сравнить (различить) полную структуру каталогов?

Как лучше всего сравнивать структуры каталогов?

У меня есть утилита резервного копирования, которая использует 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