Jeśli chcę znaleźć różnice między dwoma drzewami katalogów, zwykle po prostu wykonuję:
diff -r dir1/ dir2/
To pokazuje dokładnie, jakie są różnice między odpowiednimi plikami. Chcę tylko uzyskać listę odpowiednich plików, których zawartość różni się. Zakładałem, że będzie to po prostu kwestia przekazania opcji wiersza poleceń diff
, ale nie mogłem znaleźć niczego na stronie podręcznika.
Jakieś sugestie?
dircmp
komendy naOdpowiedzi:
Powiedziałeś Linux, więc masz szczęście (przynajmniej powinien być dostępny, nie jestem pewien, kiedy został dodany):
Powinieneś zrobić to, czego potrzebujesz.
Jeśli chcesz zobaczyć różnice w plikach, które mogą nie istnieć w żadnym z katalogów:
źródło
diff -qr dir1/ dir2/
i moja rozszerzona wersja dodiff -qr dir1/ dir2/ | grep ' differ'
--brief
skrót-q
.--brief
.-brief
jest interpretowany jako-b -r -i -e -f
, innymi słowy, jako zestaw flag, a nie jako pojedyncza opcja.Polecenie, którego używam to:
To jest dokładnie to samo, co Mark :) Ale jego odpowiedź mnie niepokoiła, ponieważ używa różnych rodzajów flag i sprawiła, że spojrzałem dwa razy. Przy użyciu bardziej szczegółowych flag Marka byłoby to:
Przepraszam za opublikowanie, gdy druga odpowiedź jest całkowicie do przyjęcia. Nie mogłem się powstrzymać ... pracując nad byciem mniej pedantycznym.
źródło
q
skrót Czy to skrót czegoś? Nie mogę znaleźć żadnej logiki zaq
..q
to jestquiet
, co ogólnie oznacza mniej gadatliwy.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 git) i ponieważ pokazuje wszystkie różnice w długim wydruku stronicowanym przy użyciu „mniej”.źródło
--no-index
więcej na stackoverflow.com/a/1792477/473390 . Zaktualizowałem odpowiedź @ alan-porter.--name-status
do wiersza poleceń, po prostu pokaże listę nazw plików z flagami „M / A / D” dla statusu Zmodyfikowany / Dodany / Usunięte.Te dwa polecenia wykonują w zasadzie to, o co proszono:
Wybór między nimi zależy od lokalizacji katalogu 1 i katalogu 2:
Gdy katalogi znajdują się na dwóch osobnych dyskach, diff przewyższa rsync. Ale gdy dwa porównywane katalogi znajdują się na tym samym dysku, rsync jest szybszy. Jest tak, ponieważ diff nakłada prawie równe obciążenie na oba katalogi równolegle, maksymalizując obciążenie dwóch dysków.
rsync oblicza sumy kontrolne w dużych porcjach przed ich faktycznym porównaniem. To grupuje operacje we / wy w duże porcje i prowadzi do bardziej wydajnego przetwarzania, gdy rzeczy mają miejsce na jednym dysku.
źródło
rsync --options /usr /bin /var /sbin /lib /old_root
skutecznie porównuje bieżący katalog główny/
(poprzez określenie w nim wszystkich podkatalogów) i/old_root
(zawiera na przykład niektóre starsze kopie zapasowe/
), co jest czymś, codiff -r
może tak. A jeśli przyjmiesz, że pliki o tym samym rozmiarze, uprawnieniach i znacznikach czasu prawdopodobnie się nie zmieniły, pominięcie--checksum
zapewni Ci niezwykle szybkie (jeśli nie tak do końca) sprawdzenie, które pliki mogły ulec zmianie.--delete
zrsync
?--dry-run
flagą) tak naprawdę nic nie jest usuwane,rsync
drukowane są tylko te pliki, które znajdują się w katalogu 1, ale nie w katalogu 2--dry-run
zawsze na pierwszym miejscu, aby nie zapomnieć o tym przypadkowo.Meld jest także 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 przejść do trybu porównywania plików i zobaczyć dokładne różnice.
źródło
meld
staje się to okropnie powolne, jeśli jest używane w dużych katalogach. Czy jest coś, co lepiej radzi sobie z dużymi katalogami?find dir1 dir2 | cut -d/ -f2- | sort | uniq --unique
meld <(find dir1 -ls ) <(find dir2 -ls)
działa całkiem dobrze, stosując podstawianie procesu bash. (zsh=(command)
działa jeszcze lepiej.)Kanałowy rodak „billings” (sławy freenode / # centos) podzielił się ze mną swoją metodą:
Dołączenie ukośnika końcowego katalogu końcowego nie ma znaczenia.
Wygląda też na to, że
-u
opcja nie jest dostępna w niektórych starszych / serwerowych wersjach diff.Różnica w różnicach:
źródło
--new-file/-N
sprawia, że diff uważa brakujące pliki za puste i--text/-a
powoduje, że wszystkie dane binarne są traktowane jako tekst. Nie widzę zalet tego konkretnego przypadku użycia.Diffoscope to świetne narzędzie do porównywania katalogów oparte na linii poleceń.
Szczególnie podoba mi się to, że może różnić się w pliki:
Nie tylko powie Ci, które pliki się różnią, ale także jak się różnią.
źródło
Aby znaleźć diff, użyj tego polecenia:
-r będzie również różnicować wszystkie podkatalogi. -q mówi, aby diff raportował tylko wtedy, gdy pliki się różnią.
--brief pokaże pliki, które nie istnieją w katalogu.
Albo
możemy użyć Melda, który pokaże w oknie graficznym, jak łatwo znaleźć różnicę.
źródło
--brief
i-q
są tą samą opcją. Twoje stwierdzenie brzmi, jakby były różne, ale nie są.Możesz także użyć
Rsync
ifind
. Dlafind
:Ale pliki o tych samych nazwach i w tych samych podfolderach, ale o innej zawartości, nie będą wyświetlane na listach.
Jeżeli jesteś fanem GUI, można sprawdzić Meld że @Alexander wspomniałem. Działa dobrze zarówno w systemie Windows, jak i Linux.
źródło
Aby zgłosić różnice między dirA i dirB, jednocześnie aktualizując / synchronizując.
rsync -auv <dirA> <dirB>
źródło