sha1sum ./path/to/directory/* | sha1sum
powyższe zostało opublikowane jako sposób na obliczenie sumy całkowitej katalogu zawierającego pliki. To polecenie kończy się niepowodzeniem, jeśli katalog zawiera więcej katalogów. Czy istnieje sposób, aby rekurencyjnie obliczać sumę całkowitą katalogu katalogów uniwersalnie (bez niestandardowego dopasowywania algorytmu do konkretnego katalogu)?
find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum
@allquixoticOgólnie podoba mi się wzorzec „znajdź | xargs”:
Musisz użyć „-print0” i „-0”, na wypadek, gdyby w nazwach plików były spacje.
Jest to jednak bardzo podobne do wzorca „find -exec cmd {}”.
Zobacz dyskusję porównującą dwa wzorce tutaj: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
źródło
find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum
.AKTUALIZACJA: Minęło kilka lat, odkąd opublikowałem tę odpowiedź, a tymczasem przepisałem i poprawiłem skrypt, który tutaj przedstawiłem kilka razy. Postanowiłem ponownie opublikować nowy skrypt jako zupełnie nową odpowiedź. Gorąco poleciłbym to nad tym.
WPROWADZENIE
Zauważyłem, że kolejność, w jakiej komenda find wyświetla znalezione elementy w katalogu, zmienia się w identycznych katalogach na różnych partycjach. Jeśli porównujesz skróty tego samego katalogu, nie musisz się tym martwić, ale jeśli otrzymujesz skróty, aby upewnić się, że żadne pliki nie zostały pominięte lub uszkodzone podczas kopiowania, musisz dołączyć dodatkowy wiersz sortowanie zawartości katalogu i jego elementów. Na przykład odpowiedź Matthew Bohnsacka jest dość elegancka:
Ale jeśli używasz go do porównywania skopiowanego katalogu do jego oryginalnego, wyślesz dane wyjściowe do pliku txt, który porównasz z listą wyjściową z innego katalogu za pomocą Kompare lub WinMerge lub po prostu uzyskując skróty każdego lis . Chodzi o to, że ponieważ kolejność wyświetlania przez narzędzie wyszukiwania zawartości może się różnić w zależności od katalogu, Kompare zasygnalizuje wiele różnic, ponieważ skróty nie zostały obliczone w tej samej kolejności. Nie jest to wielka sprawa dla małych katalogów, ale dość denerwująca, jeśli masz do czynienia z 30000 plików. Dlatego wykonałeś dodatkowe kroki w sortowaniu danych wyjściowych, aby ułatwić porównanie list skrótów między dwoma katalogami.
Spowodowałoby to sortowanie danych wyjściowych, dzięki czemu pliki z tym samym hashem będą znajdować się w tych samych wierszach podczas uruchamiania programu różnicującego (pod warunkiem, że w nowym katalogu nie brakuje żadnych plików).
I NA PISMO ...
Oto skrypt, który napisałem. Robi to samo co odpowiedź find / xarg, ale sortuje pliki przed pobraniem sha1sum (utrzymując je w tym samym katalogu). W pierwszym wierszu skryptu rekursywnie znajdują się wszystkie pliki w katalogu. Następny sortuje wyniki alfabetycznie. Następne dwa pobierają posortowaną zawartość i dołączają sha1sum i cudzysłowy do plików na posortowanej liście, tworząc duży skrypt powłoki, który oblicza skrót każdego pliku, pojedynczo i wysyła go do content_sha1sum.txt.
Mam nadzieję że to pomoże.
źródło
sort -z
(--zero-terminated
) jest łatwiejsze niż bałagan z wieloma plikami.WPROWADZENIE
Kilka lat temu napisałem i przedstawiłem (w tym wątku) skrypt, który może sprawdzić sygnatury hash wszystkich pojedynczych plików w bieżącej strukturze katalogów i wyprowadzić je jako listę w pliku tekstowym.
Od tego czasu kilkakrotnie dopracowałem tę formułę. Postanowiłem ponownie opublikować mój nowy i ulepszony skrypt tutaj jako osobną odpowiedź. Jest napisany dla sha256, ale każdy, kto nadal chce używać sha1, może przeprowadzić proste wyszukiwanie i zastąpić w gedit, aby zamienić sha256 na sha1. Osobiście nie używałem sha1 od kilku lat i nie polecałbym go, ponieważ stał się przestarzały, a Google zademonstrował, jak można go złamać .
Oto, co robi mój nowy skrypt:
Możesz po prostu użyć skryptu, przechodząc do katalogu, który chcesz haszować i wprowadzając:
Alternatywnie możesz wywołać ten skrypt z innego katalogu, wykonując:
Skrypt wykryje, czy masz uprawnienia do zapisu w bieżącym katalogu. Jeśli to zrobisz, wyniki zostaną zapisane w bieżącym katalogu. Jeśli nie masz uprawnień do zapisu lub jeśli twój bieżący katalog znajduje się w systemie tylko do odczytu (takim jak cdrom), wyniki zostaną zapisane w katalogu osobistym bieżącego użytkownika.
Skrypt wykryje, czy niektóre podkatalogi nie są dostępne przy obecnych uprawnieniach użytkownika. Jeśli wszystkie są czytelne, wówczas nie następuje podniesienie uprawnień, jeśli nie są, wówczas uprawnienia użytkownika są podnoszone do uprawnień root.
Znajdź służy do wyszukiwania wszystkich plików w bieżącej strukturze katalogów (w tym wszystkich podkatalogów). Sortowanie służy do upewnienia się, że wyniki są wyprowadzane alfabetycznie. Powstała lista przechodzi sha256sum i jest wyprowadzana do pliku tekstowego.
Od czasu napisania starego skryptu przyjąłem filozofię projektowania, że pliki tymczasowe są złe i należy ich unikać, gdy jest to możliwe, ponieważ pozostawiają one użytkowników otwartymi na szpiegowanie i manipulowanie przez złośliwe strony trzecie. Tak więc wszystkie dane w tym nowym skrypcie są przetwarzane jako zmienne do ostatniej chwili, gdy wyniki są wyprowadzane jako plik tekstowy.
Sam plik wynikowy jest mieszany, a ścieżka / skrót są wyprowadzane w terminalu. Lubię robić zdjęcia tych skrótów starym aparatem offline w trybie offline, aby mieć pewność, że plik wyników nie zostanie zmieniony, gdy odwołam się do niego w późniejszym terminie.
Stare pliki wyników są ignorowane w podsumowaniu. Ułatwia to porównywanie wyników.
Oto przykład danych wyjściowych terminala podczas uruchamiania mojego skryptu:
Oto fragment wyniku, który można znaleźć w 000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt:
(to trwa przez kolejne 7000+ linii, ale masz pomysł)
INSTALACJA
Otwórz terminal i wprowadź następujące polecenia:
W nano użyj Shif + Ctrl + v, aby wkleić. Ctrl-O i Enter, aby zapisać. Ctr-X wychodzi. Wklej tam mój skrypt:
(wklej po #! / bin / bash)
Po wyjściu z nano należy wyjść z podwyższonego statusu, wprowadzając:
KOŃCOWE PRZEMYŚLENIA
Działa to tylko wtedy, gdy masz zainstalowany bash. Użyłem składni do manipulacji podciągami, która nie działa z sh, dash, ksh lub zsh. Nadal możesz używać innych powłok jako codziennych sterowników, ale bash musi zostać zainstalowany.
Listy wyników można porównać z różnymi narzędziami, takimi jak: (w terminalu) diff, sdiff (i graficzny) diffuse, kdiff, winmerge.
Mój plik sortuje dane wyjściowe na podstawie ścieżki, aby ułatwić czytanie ludziom. Zauważyłem, że polecenie sortowania działa inaczej w różnych dystrybucjach. Na przykład, w jednej dystrybucji litery KAPITALOWE miały pierwszeństwo przed literami bez wielkich liter, aw drugiej nie. Wpływa to na kolejność plików wyjściowych i może utrudniać porównywanie plików. Nie powinno to powodować żadnych problemów, jeśli zawsze używasz skryptu w tej samej dystrybucji, ale może, jeśli listy skrótów zostały wygenerowane w dwóch różnych środowiskach. Łatwo temu zaradzić, sortując pliki skrótu dodatkowo, aby linie były uporządkowane według skrótu zamiast ścieżki:
źródło
#!/usr/bin/env bash
- znajdzie Bash również w innych katalogach, ponieważ ten ostatni może być zainstalowany na przykład w / usr / bin zamiast / bin , tymczasem env ma tendencję do bycia w / usr / bin przez cały czas o ile zauważyłem. Warto również zauważyć, że ponieważ potrzebujesz Bash, możesz użyć[[ blah-blah ]]
wyrażenia warunkowego z dwoma nawiasami zamiast bardziej ogólnego[ blah-blah ]
wariantu z jednym nawiasiem.Wydaje mi się, że to działa:
EDYCJA: spowoduje to tylko sumowanie wszystkich plików zawartych w drzewie katalogów. Jeśli nazwa katalogu zostanie zmieniona, to nie złapie go. Może coś takiego:
Zrobiłbym to. O tej samej odpowiedzi, co druga
źródło
Inną sztuczką może być użycie tar do mieszania zawartości pliku i metadanych:
źródło
Szybkie, solidne i przenośne rozwiązanie
W przeciwieństwie do niektórych innych rozwiązań
tar
, poniższe rozwiązanie działa na każdym komputerze, który ma standardowe narzędzia Uniksa i jest szybsze niż wszystkie inne rozwiązania poprzez równoległe sprawdzanie sum:Ponieważ używa on sortowania na końcu, nie ma postępu w czasie rzeczywistym, więc po prostu uruchom polecenie.
Oto, co robią argumenty:
find . -type f
znajduje wszystkie pliki w bieżącym katalogu i jego podkatalogachxargs -d'\n'
dzieli wyjście find na linie (jeśli spodziewasz się, że będziesz mieć pliki z nowymi liniami, to wykonaj zwykłe czynnościfind -print0 | xargs -0
)-P0 n1
działamd5sum
w równoległych procesach, wykorzystując maksymalną liczbę procesów obsługiwanych przez maszynę (wielordzeniowy!)sort -k 2
sortuje według drugiego polamd5sum
wyjściowego, które jest pełną ścieżką do każdego pliku (pierwszym jest MD5)md5sum
oblicza sumę kontrolną listy sum kontrolnych plików, dzięki czemu otrzymujesz sumę kontrolną całego katalogu w jednym wierszu, którą możesz łatwo porównać wizualnie w oknach terminalaZanim powiesz, że „MD5 zostało przejęte”, pamiętaj, jaki jest twój model zagrożenia. Czy chcesz się upewnić, że pliki skopiowane z innego hosta lub dysku dotarły nienaruszone? Wtedy MD5 jest więcej niż wystarczające, ponieważ szanse na uszkodzenie pliku podczas przesyłania, ale z tym samym MD5 są zerowe. Ale jeśli boisz się, że atakujący będzie miał czas na zastąpienie pliku innym plikiem z kolidującą sumą kontrolną, użyj
sha256sum
. Minusem jest to, że funkcje SHA są wolniejsze niż MD5 .Pełne postępy w czasie rzeczywistym
Wreszcie, jeśli chcesz zobaczyć postęp w czasie rzeczywistym, zmodyfikuj potok, aby używał pliku tymczasowego dla sum kontrolnych:
(Pamiętaj, że przeniesienie
sort
zaraz pofind
nie zadziałałoby, ponieważ działaxargs -P0
równoleglemd5sum
, a wyniki mogą pojawiać się poza kolejnością).Ta wersja polecenia umożliwia także różnicowanie dwóch
/tmp/sums
plików (pamiętaj, aby zmienić nazwę drugiego pliku, jeśli jest on na tym samym komputerze) i zobaczyć, które pliki się różnią.źródło
Zamiast JEDEN ogromnego pliku zawierającego wszystkie zaszyfrowane informacje szukałem sposobu na utworzenie pliku w każdym folderze drzewa. Inspirację czerpałem z komentarzy tutaj. Mój jest nieco bardziej złożony niż to, co tu zamieszczono. Używam rotacji plików, ale jest to najmniej skomplikowane dla nowych odtwarzaczy. Ta wersja spowoduje zastąpienie starych sum czeków nowymi. Dobrze jest zachować 2-3 wersje, w zależności od tego, jak często go uruchamiasz i potrzeby „głębokości”.
Zauważ, że mkshaindir, dla moich celów, jest osobnym komponentem, ponieważ może zaistnieć potrzeba stworzenia skrótu plików w nowym folderze lub w niedawno zmienionym folderze. W razie potrzeby można to wszystko połączyć w jeden skrypt.
Resztę pozostawia się jako ćwiczenie dla czytelnika.
źródło
na podstawie poprzedniej odpowiedzi :
find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum
źródło
@allquixotic
Odpowiedź nie generuje takich samych skrótów na różnych komputerach, co nie pomoże nam zweryfikować i mieć spójnych skrótów.Następujący wiersz
find . -type f \( -exec md5sum "$PWD"/{} \; \)
zwraca następujące dane wyjściowe:Dlatego ścieżka byłaby inna na różnych komputerach.
awk '{print $1}'
pomoże nam uzyskać pierwszą kolumnę, która ma tylko skrót plików. Później musimy posortować te skróty, w których kolejność może być różna na różnych komputerach, co może również powodować, że będziemy mieć różne skróty, jeśli są więcej niż dwa pliki.Rozwiązanie:
Dla Maca:
W systemie Linux:
źródło