Biorąc pod uwagę dwa drzewa katalogów, Jak mogę dowiedzieć się, które Pliki różnią się zawartością?

Jeśli chcę znaleźć różnice między dwoma drzewami katalogów, Zwykle wykonuję:

diff -r dir1/ dir2/

Wyświetla dokładnie, jakie są różnice między odpowiednimi plikami. Interesuje mnie tylko lista odpowiednich plików, których zawartość się różni. Założyłem, że będzie to po prostu kwestia przekazania opcji linii poleceń diff, ale nie mogłem znaleźć niczego na stronie podręcznika.

Jakieś sugestie?
Author: Chris Stryczynski, 2011-02-14

10 answers

Powiedziałeś Linux, więc masz szczęście (przynajmniej powinien być dostępny, Nie wiem kiedy został dodany):

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options
Powinieneś zrobić to, czego potrzebujesz.

Jeśli chcesz również zobaczyć różnice dla plików, które mogą nie istnieć w żadnym z katalogów:

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options
 1198
Author: Mark Loeser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-22 17:40:06

Komenda, której używam to:

diff -qr dir1/ dir2/

Jest dokładnie taka sama jak marka :) ale jego odpowiedź mnie niepokoiła, ponieważ używa różnych typów FLAG, i to sprawiło, że spojrzałem dwa razy. Używając bardziej wyrazistych FLAG marka będzie to:

diff  --brief --recursive dir1/ dir2/

Przepraszam za zamieszczenie, gdy druga odpowiedź jest całkowicie akceptowalna. Nie mogłem się powstrzymać... praca nad byciem mniej pedantycznym.

 297
Author: FPC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-01 10:10:31

Lubię używać git diff --no-index dir1/ dir2/, ponieważ może pokazywać różnice w Kolorze (jeśli masz tę opcję ustawioną w konfiguracji Gita) i ponieważ pokazuje wszystkie różnice w długim paged wyjścia za pomocą "less".

 114
Author: Alan Porter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 13:42:37

Te dwa polecenia robią w zasadzie to, o co prosiliśmy:

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt

Wybór pomiędzy nimi zależy od lokalizacji dir1 i dir2:

Gdy katalogi znajdują się na dwóch oddzielnych dyskach, diff przewyższa rsync. Ale gdy dwa porównywane katalogi znajdują się na tym samym dysku, rsync jest szybszy. Dzieje się tak dlatego, że diff nakłada prawie równe obciążenie na oba katalogi równolegle, maksymalizując obciążenie na dwóch napędach.

Rsync oblicza sumy kontrolne w dużych kawałkach przed faktycznie porównując je. To grupuje operacje We/Wy na duże kawałki i prowadzi do bardziej wydajnego przetwarzania, gdy rzeczy odbywają się na jednym dysku.

 38
Author: CodeBug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-06 01:49:20

Meld jest również doskonałym narzędziem do porównywania dwóch katalogów:

meld dir1/ dir2/

Meld ma wiele opcji porównywania plików lub katalogów. Jeśli dwa pliki różnią się, łatwo jest przejść do trybu porównywania plików i zobaczyć dokładne różnice.

 25
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 11:44:36

Rodak kanału ' billings '(z freenode/#centos) podzielił się ze mną swoją metodą:

diff -Naur dir1/ dir2

Włączenie ostatniego ukośnika katalogu nie ma znaczenia.

Wygląda na to, że opcja -u nie jest dostępna w niektórych starszych / serwerowych wersjach diff.

Różnica w diffs:

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ
 11
Author: todd_dsm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 15:06:25

Aby znaleźć diff użyj polecenia:

diff -qr dir1/ dir2/

-r spowoduje również różnicowanie wszystkich podkatalogów -q każe diff raportować tylko wtedy, gdy Pliki się różnią.

diff  --brief dir1/ dir2/

--brief pokaże pliki znajdujące się w katalogu dosent.

Or else

Możemy użyć Meld, który pokaże w graficznym oknie jego łatwo znaleźć różnicę.

meld  dir1/ dir2/
 5
Author: Javeed Shakeel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Diffoscope jest doskonałym narzędziem do różnicowania katalogów w wierszu poleceń.

Szczególnie podoba mi się w nim to, że może różnicować na Pliki:

Rozpakuje rekurencyjnie archiwa różnego rodzaju i przekształci różne formaty binarne w bardziej czytelną dla człowieka formę, aby je porównać. Może równie łatwo porównać dwa tarballe, obrazy ISO lub PDF.

Powie Ci nie tylko, które Pliki się różnią, ale także jak się różnią.

 4
Author: nh2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 15:56:13

Możesz również używać Rsync i find. Dla find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

Ale pliki o tych samych nazwach i w tych samych podfolderach, ale z inną zawartością, nie będą wyświetlane na listach.

Jeśli jesteś fanem GUI, możesz sprawdzić Meld , że @Alexander wspomniał. Działa dobrze zarówno w systemie windows, jak i linux.

 2
Author: Fábio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 21:10:33

Aby zgłaszać różnice między dirA i dirB, jednocześnie aktualizując / synchronizując.

rsync -auv <dirA> <dirB>

 2
Author: Kickaha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-21 17:54:07