Dobrym sposobem na to porównanie jest użycie find
z md5sum
, a następnie a diff
.
Przykład
Użyj polecenia find, aby wyświetlić listę wszystkich plików w katalogu, a następnie obliczyć skrót md5 dla każdego pliku i potokować go posortowanym według nazwy pliku do pliku:
find /dir1/ -type f -exec md5sum {} + | sort -k 2 > dir1.txt
Wykonaj tę samą procedurę w innym katalogu:
find /dir2/ -type f -exec md5sum {} + | sort -k 2 > dir2.txt
Następnie porównaj wynik dwóch plików z diff
:
diff -u dir1.txt dir2.txt
Lub jako pojedyncze polecenie przy użyciu podstawienia procesu:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2) <(find /dir2/ -type f -exec md5sum {} + | sort -k 2)
Jeśli chcesz zobaczyć tylko zmiany:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ") <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ")
Polecenie cięcia drukuje tylko skrót (pierwsze pole) do porównania przez diff. W przeciwnym razie diff wypisze każdą linię, ponieważ ścieżki katalogu różnią się, nawet jeśli skrót jest taki sam.
Ale nie będziesz wiedział, który plik się zmienił ...
W tym celu możesz spróbować czegoś takiego
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /') <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /')
Ta strategia jest bardzo przydatna, gdy dwa katalogi, które mają być porównywane, nie znajdują się na tym samym komputerze i musisz upewnić się, że pliki są równe w obu katalogach.
Innym dobrym sposobem na wykonanie zadania jest użycie diff
polecenia Gita (może powodować problemy, gdy pliki mają różne uprawnienia - wtedy każdy plik jest wyświetlany na wyjściu):
git diff --no-index dir1/ dir2/
bash --version
?