Найкращий спосіб порівняння (розходження) повної структури каталогів?


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. Він створює файл виправлення, який ви можете порівняти або поширити.


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 каталогів. Ви також можете бачити відмінності та копіювати файли від одного до іншого.


4

З сторінки man 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


1
-rозначає рекурсивний, він не підключається до віддаленого хоста!
Майкл Хемптон


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.