Właściwy sposób zależy od tego, dlaczego pytasz:
Opcja 1: Porównaj tylko dane
Jeśli potrzebujesz skrótu zawartości pliku drzewa, to załatwi sprawę:
$ find -s somedir -type f -exec md5sum {} \; | md5sum
Najpierw podsumowuje całą zawartość pliku osobno, w przewidywalnej kolejności, a następnie przekazuje tę listę nazw plików i skrótów MD5 do samodzielnego mieszania, co daje pojedynczą wartość, która zmienia się tylko, gdy zmienia się zawartość jednego z plików w drzewie.
Niestety find -s
działa tylko z BSD find (1), używanym w macOS, FreeBSD, NetBSD i OpenBSD. Aby uzyskać coś porównywalnego w systemie z GNU lub SUS find (1), potrzebujesz czegoś nieco brzydszego:
$ find somedir -type f -exec md5sum {} \; | sort -k 2 | md5sum
Zastąpiliśmy find -s
telefonem na numer sort
. -k 2
Nieco informuje go przeskoczyć mieszania MD5, a więc tylko sortuje nazwy plików, które są w polu 2 przez end-of-line, przez sort
„s liczenia.
Ta wersja polecenia ma słabość, ponieważ może się zdezorientować, jeśli masz jakieś nazwy plików z nowymi liniami, ponieważ będzie to wyglądało jak wiele linii do sort
wywołania. find -s
Wariant nie ma tego problemu, ponieważ przechodzenie drzewa i sortowania zdarzyć w tym samym programie find
.
W obu przypadkach sortowanie jest konieczne, aby uniknąć fałszywych trafień: najpopularniejsze systemy plików Unix / Linux nie utrzymują list katalogów w stabilnej, przewidywalnej kolejności. Możesz nie zdawać sobie z tego sprawy z używania ls
i takich, które dyskretnie sortują zawartość katalogu za Ciebie. find
bez -s
lub sort
wywołanie będzie drukować pliki w dowolnej kolejności, w jakiej system plików je zwraca, co spowoduje, że to polecenie da zmienioną wartość skrótu, jeśli kolejność plików przekazanych mu jako dane wejściowe ulegnie zmianie.
Może być konieczna zmiana md5sum
poleceń na md5
lub inna funkcja skrótu. Jeśli wybierzesz inną funkcję skrótu i potrzebujesz drugiej formy polecenia dla swojego systemu, może być konieczne odpowiednie dostosowanie sort
polecenia. Inną pułapką jest to, że niektóre programy sumujące dane w ogóle nie wypisują nazw plików, czego najlepszym przykładem jest stary sum
program uniksowy .
Ta metoda jest nieco nieefektywna, md5sum
ponieważ wywołuje N + 1 razy, gdzie N jest liczbą plików w drzewie, ale jest to konieczny koszt, aby uniknąć mieszania metadanych plików i katalogów.
Opcja 2: Porównaj dane i metadane
Jeśli musisz być w stanie wykryć, że coś w drzewie się zmieniło, a nie tylko zawartość pliku, poproś tar
o spakowanie zawartości katalogu, a następnie wyślij ją na adres md5sum
:
$ tar -cf - somedir | md5sum
Ponieważ tar
widzi także uprawnienia do plików, prawa własności itp., Wykrywa to również zmiany tych rzeczy, a nie tylko zmiany zawartości plików.
Ta metoda jest znacznie szybsza, ponieważ powoduje tylko jedno przejście przez drzewo i uruchamia program mieszający tylko raz.
Podobnie jak w przypadku find
powyższej metody, tar
nazwy plików będą przetwarzane w kolejności, w jakiej system plików je zwraca. Może się zdarzyć, że we wniosku możesz mieć pewność, że tak się nie stanie. Mogę wymyślić co najmniej trzy różne wzorce użytkowania tam, gdzie jest to prawdopodobne. (Nie zamierzam ich wymieniać, ponieważ wchodzimy na terytorium nieokreślonego zachowania. Każdy system plików może być tutaj inny, nawet od jednej wersji systemu operacyjnego do następnej).
Jeśli okaże się, że otrzymujesz fałszywe wyniki, polecam skorzystanie z find | cpio
opcji w odpowiedzi Gillesa .
find .
zamiast niegofind somedir
. W ten sposób nazwy plików są takie same przy podawaniu różnych specyfikacji ścieżek do znalezienia; może to być trudne :-)