Wygeneruj sumę kontrolną md5 dla wszystkich plików w katalogu

75

Chciałbym utworzyć listę sum kontrolnych md5 dla wszystkich plików w katalogu.

Chcę cat filename | md5sum > ouptput.txt. Chcę to zrobić w 1 kroku dla wszystkich plików w moim katalogu.

Każda pomoc byłaby świetna.

Walter Wayne Leutwyler
źródło
Jak mogę znaleźć sumę kontrolną określonego pliku kopii zapasowej? -Jak powinien wyglądać mój skrypt -Co to za polecenie

Odpowiedzi:

110

Możesz przekazać md5sumwiele nazw plików lub rozszerzeń bash:

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

Jeśli chcesz się zachwycić, możesz użyć funkcji takich jak finddrążenie w dół i filtrowanie plików, a także praca rekurencyjna:

find -type f -exec md5sum "{}" + > checklist.chk
Oli
źródło
1
♦ jak wykorzystać powyższe do md5summd5sum *
pobrania
Przepraszam, że pytam, uruchamiając find -type f -exec md5sum '{}' +i `find -type f -exec md5sum '{}' 'Udało mi się to. Dzięki :)
Kasun Siyambalapitiya
Bardziej wolę wygląd tego wyjścia:openssl md5 * > checklist.txt
ashley
1
Jeśli używasz powłoki, która chętnie ocenia **rekurencyjnie (np. Zsh), jest to jeszcze prostsze:md5sum **/* 2>/dev/null
Joost
12

Świetnym programem do tworzenia / weryfikacji sum kontrolnych jest wysypka. Tworzy nawet pliki kompatybilne z SFV i sprawdza je.

Obsługuje MD4, MD5, SHA1, SHA512, CRC32 i wiele innych.

Ponadto może tworzyć rekurencyjne (opcja -r), takie jak md5deep lub sha1deep.

Wreszcie możesz sformatować dane wyjściowe pliku sumy kontrolnej; na przykład:

rhash --md5 -p '%h,%p\n' -r /home/

wypisuje plik CSV zawierający pełną ścieżkę plików rekurencyjnie rozpoczynającą się od /homekatalogu.

Uważam, że niezwykle przydatna jest nawet opcja zmiany nazwy plików przez wstawienie sumy crc32 do nazwy.

Możesz zmienić „md5sum” za pomocą „rhash” w przykładach PhoenixNL72.

Marcolino
źródło
1
Co dokładnie robi tutaj „/ home /”? To narzędzie wygląda całkiem dobrze.
Andy Ibanez,
Myślę, że to błąd, to na pewno błędy dla mnie. -P jest formatem wyjściowym. Poprawię to.
pbhj
7

Oto dwa bardziej obszerne przykłady:

  1. Utwórz plik md5 w każdym katalogu, który jeszcze go nie ma, z bezwzględnymi ścieżkami:

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. Utwórz plik md5 w każdym folderze, który jeszcze go nie ma: żadnych ścieżek, tylko nazwy plików:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

Różnica między 1 a 2 polega na sposobie prezentacji plików w wynikowym pliku md5.

Polecenia wykonują następujące czynności:

  1. Utwórz listę nazw katalogów dla bieżącego folderu. (Drzewo)
  2. Posortuj listę folderów.
  3. Sprawdź w każdym katalogu, czy istnieje plik @ md5sum.md5. Wyjście pomijane, jeśli istnieje, przetwarzanie wyjściowe, jeśli nie istnieje.
  4. Jeśli plik @ md5Sum.md5 nie istnieje, md5Sum wygeneruje jeden z sumami kontrolnymi wszystkich plików w folderze. 5) Ustaw wygenerowany plik @ md5Sum.md5 na tylko do odczytu.

Dane wyjściowe całego skryptu można przekierować do pliku (.....; done> test.log) lub przesłać do innego programu (np. Grep). Dane wyjściowe pokażą tylko, które katalogi zostały pominięte, a które przetworzone.

Po udanym uruchomieniu skończysz z plikiem @ md5Sum.md5 w każdym podkatalogu bieżącego katalogu

Nazwałem plik @ md5Sum.md5, aby znalazł się na górze katalogu w udziale samby.

Weryfikowanie wszystkich plików @ md5Sum.md5 można wykonać za pomocą następujących poleceń:

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

Następnie możesz grepować plik checklog.txt za pomocą grep -v OK, aby uzyskać listę wszystkich plików, które się różnią.

Aby ponownie wygenerować plik @ md5Sum.md5 w określonym katalogu, na przykład po zmianie lub dodaniu plików usuń plik @ md5Sum.md5 lub zmień jego nazwę i ponownie uruchom komendę generowania.

PhoenixNL72
źródło
Polecenie nr 1 przy użyciu pełnych ścieżek: md5sum "$ {dir}" / * nie pobiera ukrytych plików zaczynających się od kropki. Jakieś lekarstwo?
user14654
Późno na imprezę, ale ponieważ md5sum chce nazw plików (wydaje się niezadowolony, jeśli dasz mu katalog), najłatwiej jest poprosić o pomoc: $ md5sum $ (znajdź "$ dir" -maxdepth 0 -typ f) The "- typ f "ściąga zwykłe i ukryte pliki (także find ma wiele opcji, ale może być bardzo pomocny). Pomiń część „-maxdepth 0”, jeśli chcesz wszystko rekurencyjnie. Uwaga: jest to niestabilne, jeśli w nazwach plików znajdują się spacje, możesz przeczytać na xargs i -0 ( en.wikipedia.org/wiki/Xargs )
jgreve,
0

Dotknąłem tego problemu i chociaż powyższe rozwiązania są eleganckie, chciałem szybkiego i brudnego włamania do tej sytuacji: 1 katalog z podkatalogami o jeden poziom głęboko w środku.

Wpisz katalog w powłoce i uruchom:

md5sum * */* 2>/dev/null > md5sum.md5

Spowoduje to pobranie wszystkich plików z katalogu najwyższego poziomu, usunięcie ostrzeżenia o błędzie dotyczącego podkatalogów będących katalogami, a następnie uruchomienie md5sums na zawartości podkatalogu. Zaleta: łatwa do zapamiętania, robi dokładnie to, co powinna. Zawsze się mylę ze składnią find i nigdy nie pamiętam jej z góry głowy, więc nie trzeba zapętlać itp., Zajmując się spacjami w nazwach katalogów, ta jedna linijka działała dobrze. Nie jest to solidne, wydajne rozwiązanie, nie nadaje się do> 1 poziomu podkatalogów, ale szybkie i łatwe rozwiązanie problemu.

Lizardx
źródło