Odpowiedzi:
Możesz użyć do tego diff
polecenia:
diff -bur folder1/ folder2/
Spowoduje to wygenerowanie rekurencyjnego diff, który ignoruje spacje, z ujednoliconym kontekstem:
-b
ignoruje zmiany białych znaków i -u
daje 3 linie bufora.
diff -rub folder1/ folder2/
-bur
że łatwo byłoby zapamiętać, gdybyś mieszkał w zimnym klimacie.
Jeśli chcesz zobaczyć tylko różne pliki, możesz użyć:
diff -qr dir_one dir_two | sort
Opcja „q” pokaże tylko pliki, które się różnią, ale nie różnią się treścią, a „sort” uporządkuje dane wyjściowe alfabetycznie.
diff
na temat każdej pary różnych plików. Podejście byłoby zupełnie inne, gdyby tylko jeden lub dwa pliki różniły się w porównaniu z dziesiątkami plików. Mogłem zgubić dane wyjściowe z jednoczesnego pobrania diff
dziesiątek plików!
-x PATTERN
w poleceniu wykluczenie niektórych podkatalogów. Na przykład diff -qr repo1 repo2 -x ".git"
porówna dwa katalogi (repo1 i repo2), ale wykluczy pliki w folderze .git odpowiednich katalogów.
diff
może nie tylko porównywać dwa pliki, ale także, korzystając z -r
opcji, chodzić po całych drzewach katalogów, rekurencyjnie sprawdzając różnice między podkatalogami i plikami występującymi w porównywalnych punktach w każdym drzewie.
$ man diff
...
-r --recursive
Recursively compare any subdirectories found.
...
Jeśli jest to GNU diff, powinieneś być w stanie wskazać go na dwa katalogi i użyć opcji -r.
W przeciwnym razie spróbuj użyć
for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done
Uwaga: Jak zauważył Dennis w sekcji komentarzy, tak naprawdę nie trzeba wykonywać podstawiania poleceń na ls. Robię to od tak dawna, że właściwie robię to na autopilocie i zastępuję polecenie, aby uzyskać listę plików do porównania.
Zapomniałem również dodać, że robię „\ ls”, aby tymczasowo wyłączyć mój alias ls do GNU ls, aby stracić informacje o formatowaniu kolorów z listy zwróconej przez GNU ls.
ls
:for i in ./dir1/*
Oto skrypt pokazujący różnice między plikami w dwóch folderach. Działa rekurencyjnie. Zmień katalog 1 i katalog 2.
(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/} $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )
Jeśli nie chcesz porównywać zawartości plików i sprawdzać tylko, które nie są obecne w obu katalogach, możesz porównać listy plików wygenerowane przez inne polecenie.
diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'
-printf '%P\n'
mówi, find
aby nie poprzedzać ścieżek wyjściowych katalogiem głównym.
Dodałem również, sort
aby upewnić się, że kolejność plików będzie taka sama w obu wywołaniach find
.
Na grep
końcu usuwa informacje o identycznych liniach wejściowych.
Spróbuj tego:
diff -rq /path/to/folder1 /path/to/folder2
diff
polecenia, pobierając narzędzia GNU dla Win32 .