Jak porównać różnice między katalogami (Linux)

24

Mam dwa katalogi - jeden z wcześniejszej kopii zapasowej i drugi z najnowszej kopii zapasowej. Jak porównać zmiany wprowadzone w plikach w katalogu od najnowszej kopii zapasowej w systemie Linux? Również, jak wyświetlać zmiany na przykład w plikach tekstowych i php - myślę o czymś takim, jak historia zmian na Wikipedii, gdzie widzisz starą wersję po jednej stronie ekranu i najnowszą wersję po drugiej, a zmiany są podświetlone. Jak mogę osiągnąć coś takiego?

edycja: Jak mogę również porównać zdalny katalog z lokalnym?

Phil
źródło

Odpowiedzi:

35

Ze strony man diff:

Jeśli zarówno z pliku, jak i do pliku są katalogami, diff porównuje odpowiednie pliki w obu katalogach, w kolejności alfabetycznej; to porównanie nie jest rekurencyjne, chyba że podano opcję -r lub --recursive. diff nigdy nie porównuje faktycznej zawartości katalogu tak, jakby był plikiem. Plik, który jest w pełni określony, może nie być standardowym wejściem, ponieważ standardowe wejście jest bezimienne i pojęcie „plik o tej samej nazwie” nie ma zastosowania.

Aby porównać katalogi: diff --brief -r dir1 dir2

Aby porównać pliki obok siebie: diff --side-by-side file1 file2

Sean Staats
źródło
bardzo fajnie, spróbuję
Phil
... zastanawiam się, jak porównać katalog zdalny z katalogiem lokalnym?
Phil
1
Będziesz musiał zamontować katalog zdalny na komputerze lokalnym. Możesz jednak zdalnie porównać takie pliki: ssh REMOTE_SERVER "cat / path / to / some / file" | diff - side-by-side / path-to-some-file - Inną rzeczą jest polecenie „sdiff”, które działa jak „diff - side-by-side”, jeśli chcesz zapisać trochę pisania.
Sean Staats
2
Użyj NFS, aby zamontować katalog zdalny. Na zdalnym serwerze (server-b) edytuj / etc / export i umieść w nim: / path / of / directory / to / share server-a.ip.address (ro, no_root_squash) Uruchom NFS na serwerze b (/etc/init.d/nfs start) Podłącz do lokalnego serwera (serwer-a), dodając następujące elementy do / etc / fstab: server-b.ip.add: / path / of / directory / to / share / mnt / server-b nfs rsize = 32768, wsize = 32768, rw 0 0 Następnie na serwerze-a, mkdir / mnt / server-b; mount / mnt / server-b Dzięki za upvotes.
Sean Staats
2
Można użyć sshfsdo utworzenia tymczasowego katalogu sieciowego ad-hoc zamiast NFS.
Dan Andreatta
3

Zarozumiały:

  • jesteśmy na www1porównując z pilotemwww2
  • istnieje uwierzytelnienie klucza publicznego z lokalnego www1na zdalnywww2
  • porównujemy jako ten sam użytkownik lokalnie www1i zdalniewww2
znajdź / 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 
użytkownik69366
źródło
3

Naprawdę chcesz połączyć moc rsynczmniejszania zużycia przepustowości z mocą, diffaby dać ci elastyczne, dobrze um diffs.

Więc coś takiego:

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

Myślę, że możesz to trochę poprawić, jeśli robisz to często używaj rsynczamiast cpw pierwszym wierszu - oczywiście w ostatnim wierszu masz pełną moc diffformatowania, jak chcesz. Prawdopodobnie zy w przypadku PO

Minusem tego podejścia jest to, że używasz dwukrotnie więcej lokalnej przestrzeni, ale mniej niż 1 $ za koncert, kogo to obchodzi?

ErichBSchulz
źródło
cp --reflink=auto --sparse=alwaysnie używać miejsca na kopię w zależności od bazowego FS.
Tom Hale
1

Rób diff old_dir new_dir > diff.txtróżnice obok siebie na tym samym serwerze.

W przypadku plików zdalnych:

Na przykład: ABC to istniejący serwer, a XYZ to serwer zdalny, a nazwa katalogu to 123.

Krok 1: Zmień nazwę istniejącego katalogu 123 na ABC Server na 123_ABC.

ABC:/Home > mv 123 123_ABC

Krok 2: Utwórz nowy katalog na serwerze ABC:

ABC: > mkdir 123_XYZ

Krok 3: Skopiuj wszystkie pliki z katalogu 123 na serwerze XYZ do katalogu 123_XYZ na serwerze ABC:

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

Spowoduje to skopiowanie wszystkich plików z katalogu na serwerze XYZ do katalogu ABC server / 123_XYZ.

Krok: 4: Zrób różnicę między dwoma katalogami:

Teraz przejdź do serwera ABC i wykonaj różnicę między 123_ABC a 123_XYZ

ABC > diff 123_ABC 123_XYZ > diff.txt

Powyższe polecenie zapisze wyniki porównania w pliku diff.txt na tej samej ścieżce.

Następnie możesz porównać różnice.

Dziękuję Ci,

Mehul

Mehul
źródło
0

AIDE Advanced Intrusion Detection Environment (AIDE) to narzędzie do sprawdzania integralności plików dla systemów operacyjnych UNIX. Jego celem jest dostarczanie raportów na temat integralności danych w obsługiwanych systemach plików. Uruchamiając AIDE wiele razy na hoście docelowym, możesz określić, które pliki się zmieniają. Uruchamiając AIDE wiele razy na różnych hostach, możesz określić, jakie pliki i uprawnienia są różne. Następnie użyj narzędzia gui diff na zgłoszonych „różnych” plikach.

Lub użyj narzędzia GUI diff, takiego jak meld, guiffy, kdiff3, diff, vimdiff, gvimdiff, Emacs, Kompare, Diffuse, Easydiff, TkDiff lub xxdiff. Większość zrobi różnice katalogów oprócz różnic plików. Będziesz musiał zamontować dysk zdalny za pomocą NFS, SMBFS lub SSHFS, jak wspomnieli inni.


źródło
0

Lub możesz użyć dwóch plików z wypisaną listą plików. A następnie porównaj te dwa pliki. Na przykład:

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

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

Pobierz jeden z plików.

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

do FILE.TXT

Użyj diff ( diff -y remote-files local-files > diff-files), aby porównać je obok siebie. Otwórz pliki różnic i sprawdź. Każda linia z> oznacza inny plik.

Mark Henderson
źródło