Как сравнить различия между каталогами (Linux)

24

У меня есть две директории - одна из более ранней резервной копии и вторая из новейшей резервной копии. Как сравнить, какие изменения были внесены в файлы в каталоге из новейшей резервной копии в Linux? Также, как мне отобразить изменения, например, в текстовых и php файлах - я думаю о чем-то вроде истории изменений в Википедии, где вы видите старую версию на одной стороне экрана и самую новую версию на другой, и изменения подсвечиваются. Как мне достичь чего-то подобного?

Редактировать: Как я могу также сравнить удаленный каталог с локальным?

Фил
источник

Ответы:

35

Из справочной страницы diff:

Если оба файла from-file и to-file являются каталогами, diff сравнивает соответствующие файлы в обоих каталогах в алфавитном порядке; это сравнение не является рекурсивным, если не задана опция -r или --recursive. diff никогда не сравнивает фактическое содержимое каталога, как если бы это был файл. Файл, который полностью указан, может не быть стандартным вводом, потому что стандартный ввод является безымянным и понятие «файл с тем же именем» не применяется.

Итак, для сравнения каталогов: diff --brief -r dir1 dir2

Чтобы сравнить файлы рядом: diff --side-by-side file1 file2

Шон Стаатс
источник
очень круто, я попробую
Фил
... интересно, как сравнить удаленный каталог с локальным?
Фил
1
Вы должны будете смонтировать удаленный каталог на локальный компьютер. Однако вы можете удаленно сравнивать файлы так: ssh REMOTE_SERVER "cat / path / to / some / file" | diff - side-by-side / path-to-some-file - Еще одна вещь, команда 'sdiff' работает как 'diff - side-by-side', если вы хотите сохранить некоторую типизацию.
Шон Стаатс
2
Используйте NFS для монтирования удаленного каталога. На удаленном сервере (сервер-b) отредактируйте файл / etc / exports и поместите в него следующее: / path / of / directory / to / share server-a.ip.address (ro, no_root_squash) Запустите NFS на сервере-b (/etc/init.d/nfs start) Подключитесь к локальному серверу (server-a), добавив следующее в / etc / fstab: server-b.ip.add: / path / of / directory / to / share / mnt / server-b nfs rsize = 32768, wsize = 32768, rw 0 0 Затем на сервере a, mkdir / mnt / server-b; mount / mnt / server-b Спасибо за отзыв.
Шон Стаатс
2
Вы можете использовать sshfsспециальный временный сетевой каталог вместо NFS.
Дэн Андреатта
3

Предполагая, что:

  • мы находимся www1, сравнивая с удаленнымwww2
  • есть аутентификация с открытым ключом от локального www1к удаленномуwww2
  • мы сравниваем как одного и того же пользователя на локальном www1и удаленномwww2
find / var / www / html / -name "*" -exec md5sum -b {} \; | grep -v "/ var / www / html / exclude_this dir"> local.md5
ssh www2 "find / var / www / html / -name '*' -exec md5sum -b {} \; | grep -v / var / www / html / exclude_this dir> remote.md5"
scp www2: remote.md5.
diff local.md5 remote.md5 
user69366
источник
3

Вы действительно хотите объединить мощность, rsyncчтобы уменьшить потребление полосы пропускания с мощностью, diffчтобы дать вам гибкие, ну и отличия.

Так что-то вроде этого:

cp -R $local $bak
rsync $server:$remdir/* $local/
rsync $local/ $server:$remdir/* 
diff -wur $local $bak

Я думаю, вы могли бы немного подправить это, если бы вы делали это часто, rsyncа не cpв первой строке - очевидно, в последней строке у вас есть все возможности diffдля форматирования, как вам нравится. Вероятно, с у в случае ОП

Недостатком этого подхода является то, что вы в конечном итоге используете вдвое больше локального пространства, но при этом менее чем на 1 долл. / Гиг, кого это волнует?

ErichBSchulz
источник
cp --reflink=auto --sparse=alwaysне использовать пространство для копии в зависимости от базовой FS.
Том Хейл
1

Делайте diff old_dir new_dir > diff.txtдля параллельных различий на одном сервере.

Для удаленных файлов:

Например: ABC - это существующий сервер, а XYZ - ваш удаленный сервер, а имя каталога - 123.

Шаг 1: Переименуйте существующий каталог 123 на ABC Server как 123_ABC.

ABC:/Home > mv 123 123_ABC

Шаг 2: Создайте новый каталог на сервере ABC:

ABC: > mkdir 123_XYZ

Шаг 3: Скопируйте все файлы из каталога 123 на сервере XYZ в каталог 123_XYZ на сервере ABC:

XYZ/123 > scp * userid@ABC: /123_XYZ

Это скопирует все файлы из каталога на вашем XYZ-сервере в каталог ABC server / 123_XYZ.

Шаг: 4: Сделайте различие между обоими каталогами:

Теперь перейдите на сервер ABC и выполните различие между 123_ABC и 123_XYZ.

ABC > diff 123_ABC 123_XYZ > diff.txt

Команда выше сохранит результаты diff в diff.txt по тому же пути.

Вы можете сравнить различия тогда.

Спасибо,

Mehul

Mehul
источник
0

AIDE Advanced Intrusion Detection Environment (AIDE) является проверка целостности файлов для операционных систем UNIX. Его целью является предоставление отчетов о целостности данных в поддерживаемых файловых системах. Несколько раз запустив AIDE на целевом хосте, вы можете определить, какие файлы меняются. Запустив AIDE несколько раз на разных хостах, вы можете определить, какие файлы и разрешения отличаются. Затем используйте инструмент gui diff для указанных "разных" файлов.

Или используйте инструмент gui diff, такой как meld, guiffy, kdiff3, diff, vimdiff, gvimdiff, Emacs, Kompare, Diffuse, Easydiff, TkDiff или xxdiff. Большинство из них будет делать различия в каталогах в дополнение к различиям в файлах. Вам нужно будет смонтировать удаленный диск, используя NFS, SMBFS или SSHFS, как уже упоминали другие.


источник
0

Или вы можете использовать два файла с выходом списка файлов. А затем сравните эти два файла. Например:

/path/to/compare/remote$: ls > remote-files 

/path/to/compare/local$: ls > local-files 

Загрузите один из файлов.

-rw-r - r-- 1 1015 1015 26624 2005-06-14 13:10 FILE.TXT  

FILE.TXT

Используйте diff ( diff -y remote-files local-files > diff-files), чтобы сравнить их рядом. Откройте diff-файлы и проверьте его. Каждая строка с> означает другой файл.

Марк Хендерсон
источник