Muszę obliczyć sumaryczną sumę kontrolną md5 dla wszystkich plików określonego typu ( *.py
na przykład) umieszczonych w katalogu i wszystkich podkatalogach.
Jaki jest najlepszy sposób, aby to zrobić?
Edycja: Proponowane rozwiązania są bardzo ładne, ale nie jest to dokładnie to, czego potrzebuję. Szukam rozwiązania pozwalającego uzyskać pojedynczą sumę kontrolną podsumowania, która jednoznacznie zidentyfikuje katalog jako całość - w tym zawartość wszystkich jego podkatalogów.
Odpowiedzi:
Polecenie find wyświetla listę wszystkich plików kończących się na .py. Suma md5 jest obliczana dla każdego pliku .py. awk jest używany do wybierania sum md5 (ignorując nazwy plików, które mogą nie być unikalne). Sumy md5 są sortowane. Następnie zwracana jest suma md5 tej posortowanej listy.
Przetestowałem to, kopiując katalog testowy:
Zmieniłem nazwy niektórych plików w ~ / pybin2.
find...md5sum
Polecenie zwraca taki sam wynik dla obu katalogach.źródło
awk ...
część, jeśli weźmiesz pod uwagę część układu podpisu.Utwórz plik archiwum tar w locie i potokuj go do
md5sum
:Daje to pojedynczą sumę md5, która powinna być unikalna dla konfiguracji pliku i podkatalogu. Na dysku nie są tworzone żadne pliki.
źródło
ls -alR dir | md5sum
. To jest jeszcze lepsze bez kompresji, tylko odczyt. Jest wyjątkowy, ponieważ zawartość zawiera czas modyfikacji i rozmiar pliku;)z
dla gzip lubj
bzip2. Ja też nie.tar
dwukrotne wykonanie tego samego zestawu plików lub na dwóch różnych komputerach da dokładnie ten sam wynik.Sugestia ire_and_curses dotycząca używania
tar c <dir>
ma pewne problemy:rsync -a --delete
robi: synchronizuje praktycznie wszystko (bez xattrs i acls), ale synchronizuje właściciela i grupę na podstawie ich identyfikatora, a nie reprezentacji ciągu. Więc jeśli zsynchronizowałeś się z innym systemem, który niekoniecznie ma tych samych użytkowników / grupy, powinieneś dodać--numeric-owner
flagę do tarDopóki nie ma rozwiązania dla pierwszego problemu (lub jeśli nie masz pewności, że nie dotyczy on Ciebie), nie zastosowałbym tego podejścia.
W
find
oparciu rozwiązania zaproponowane powyżej to również nie jest dobre, ponieważ obejmują one tylko te pliki, nie katalogów, która staje się problemem, jeśli was sum kontrolnych należy pamiętać pustych katalogów.Wreszcie, większość sugerowanych rozwiązań nie sortuje się konsekwentnie, ponieważ sortowanie może być różne w różnych systemach.
Oto rozwiązanie, które wymyśliłem:
Uwagi dotyczące tego rozwiązania:
LC_ALL=C
to na celu zapewnienie niezawodnej kolejności sortowania w różnych systemach-print0
flagi dla,find
ale ponieważ są tu inne rzeczy, widzę tylko rozwiązania, które uczyniłyby polecenie bardziej skomplikowanym, niż jest warte.PS: jeden z moich systemów używa ograniczonego busyboxa,
find
który nie obsługuje-exec
ani-print0
flag, a także dodaje „/” w celu oznaczenia katalogów, podczas gdy findutils find nie wydaje się, więc dla tego komputera muszę uruchomić:Na szczęście nie mam plików / katalogów z nowymi wierszami w nazwach, więc nie jest to problem w tym systemie.
źródło
Jeśli zależy Ci tylko na plikach, a nie na pustych katalogach, działa to ładnie:
źródło
Ze względu na kompletność istnieje md5deep (1) ; nie ma bezpośredniego zastosowania ze względu na wymagania dotyczące filtra * .py, ale powinno działać dobrze razem z find (1).
źródło
Rozwiązanie, które sprawdziło się najlepiej dla mnie:
Powód, dla którego to działało najlepiej dla mnie:
Problemy z innymi odpowiedziami:
Metadane systemu plików nie są ignorowane w przypadku:
tar c - "$path" | md5sum
Nie obsługuje nazw plików zawierających spacje ani nie wykrywa zmiany nazwy pliku:
źródło
Jeśli chcesz, aby jedna suma md5 obejmowała cały katalog, zrobiłbym coś takiego
źródło
cat **.py
| md5sumSuma kontrolna wszystkich plików, w tym zarówno zawartość, jak i ich nazwy
To samo co powyżej, ale zawiera tylko pliki * .py
Jeśli chcesz, możesz również śledzić linki symboliczne
Inne opcje, które możesz rozważyć w połączeniu z grep
źródło
Znajdź GNU
źródło
Technicznie wystarczy biec
ls -lR *.py | md5sum
. O ile nie martwisz się, że ktoś zmodyfikuje pliki i przywróci ich pierwotne daty i nigdy nie zmieni rozmiarów plików, dane wyjściowe zls
powinny informować, czy plik się zmienił. Mój unix-foo jest słaby, więc możesz potrzebować więcej parametrów wiersza poleceń, aby uzyskać czas utworzenia i czas modyfikacji do wydrukowania.ls
poinformuje Cię również, czy uprawnienia do plików uległy zmianie (i jestem pewien, że są przełączniki, które mogą to wyłączyć, jeśli nie dbasz o to).źródło
touch
plik, aby zmienić jego datę (ale nie jego zawartość), spodziewałbym się, że suma kontrolna pozostanie niezmieniona.Używając
md5deep
:md5deep -r FOLDER | awk '{print $1}' | sort | md5sum
źródło
Miałem ten sam problem, więc wymyśliłem ten skrypt, który po prostu wyświetla sumy md5 plików w katalogu i jeśli znajdzie podkatalog, uruchamia się ponownie stamtąd, aby to się stało, skrypt musi być w stanie uruchomić bieżący katalogu lub z podkatalogu, jeśli wspomniany argument jest przekazywany w $ 1
źródło
Jeśli chcesz naprawdę uniezależnić się od atrybutów systemu plików i od różnic w poziomie bitów niektórych wersji tar, możesz użyć cpio:
źródło
Istnieją jeszcze dwa rozwiązania:
Stwórz:
Czek:
źródło
md5sum
działało dobrze, ale miałem problemy zsort
sortowaniem nazw plików. Więc zamiast tego posortowałem wedługmd5sum
wyniku. Musiałem również wykluczyć niektóre pliki, aby uzyskać porównywalne wyniki.find . -type f -print0 \ | xargs -r0 md5sum \ | grep -v ".env" \ | grep -v "vendor/autoload.php" \ | grep -v "vendor/composer/" \ | sort -d \ | md5sum
źródło