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

29

Какой лучший способ сравнить структуру каталогов?

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

Большое спасибо!

Уди

Адам Матан
источник

Ответы:

18

Инструмент, который вы ищете, это rdiff . Это работает как сочетание rsync и diff. Он создает файл патча, который вы можете сравнить или распространить.

brianegge
источник
9

Некоторые люди хотят сравнивать файловые системы по разным причинам, поэтому я напишу здесь, что я хотел и как я это сделал.

Я хотел:

  • Чтобы сравнить ту же файловую систему с самой собой, т. Е. Снимок , внести изменения , снимок , сравнить .
  • Список файлов, которые были добавлены или удалены, не заботился об изменениях внутренних файлов.

Что я сделал:

Первый снимок ( 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 после этого.

Камило Мартин
источник
8

если вы не хотите устанавливать другой инструмент ...

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 так же легко, как найти в цикле for. И, кроме того, вы можете настроить вывод diff, чтобы он говорил что-то вроде «этот файл на хосте 1, но не на хосте 2» или что-то подобное, но в этот момент вы можете просто установить инструменты, о которых все остальные говорят ...

Крис
источник
5

В прошлом я использовал dirdiff для сравнения структур каталогов. Он работает только на локальных каталогах, поэтому вам придется sshfsподключить другие каталоги.

Хорошо, что вы можете визуально видеть, равны ли файлы или нет, и какой из них является новым или более старым. И он поддерживает до 5 каталогов. Вы также можете увидеть различия и копировать файлы из одного в другой.

chmeee
источник
4

Из справочной страницы 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.

Может быть, это поможет.

Саураб Баржатия
источник
Спасибо, но это не решает мою проблему (я ищу различие, чтобы фактически отличить).
Адам Матан
4

diff -rна самом деле работает довольно хорошо. Если вы просто хотите узнать, отличаются ли файлы, а не от фактического содержания различий,diff -qr

AlexB
источник
1
-rзначит рекурсивный, он не подключается к удаленному хосту!
Майкл Хэмптон
3

Я бы использовал Meld для этого.

pupeno
источник
Мелд работает очень хорошо для этого, если вы хотите решение с графическим интерфейсом.
Дрю Ноакс
2

Помимо инструментов, уже упомянутых в Windows, вы можете использовать Total Commander или WinSCP, оба имеют очень удобные функции для сравнения (и синхронизации) каталогов.


источник
0

Я действительно не хотел устанавливать что-то новое, поэтому мое решение немного грубое, но быстрое и эффективное.

Я хотел сравнить все файлы, которые были скопированы, и их файловый режим, владение и контекст безопасности SELinux остаются без изменений.

Итак, я побежал:

rsync -aX /orig /copy/

а затем сравнить, как это:

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

Если содержимое обоих файлов остается свернутым, то они идентичны. Если нет, показывается разница.

Обновите параметры, lsчтобы они отражали атрибуты, которые необходимо проверить. YMMV

Helvete
источник