it-swarm-eu.dev

Jak získám MD5 součet obsahu adresáře jako jednu částku?

Program md5sum neposkytuje kontrolní součty pro adresáře. Chci získat jediný kontrolní součet MD5 pro celý obsah adresáře, včetně souborů v podadresářích. To znamená, že jeden kombinovaný kontrolní součet se skládá ze všech souborů. Existuje způsob, jak to udělat?

183
user17429

Správná cesta závisí na tom, proč přesně se ptáte:

Možnost 1: Porovnat pouze údaje

Pokud potřebujete pouze hash obsahu souboru stromu, provede se tento trik:

$ find -s somedir -type f -exec md5sum {} \; | md5sum

Toto nejprve shrne veškerý obsah souboru jednotlivě v předvídatelném pořadí, poté předá tento seznam názvů souborů a hashů MD5, které se mají hashovat, a poskytne jedinou hodnotu, která se změní pouze tehdy, když se změní obsah jednoho ze souborů ve stromu.

Bohužel, find -s Funguje pouze s nálezem BSD (1), který se používá v makrech, FreeBSD, NetBSD a OpenBSD. Chcete-li získat něco srovnatelného v systému s GNU nebo SUS najít (1)), potřebujete něco ošklivějšího:

$ find somedir -type f -exec md5sum {} \; | sort -k 2 | md5sum

Napodobili jsme chování BSD find -s Přidáním hovoru do sort. Bit -k 2 Říká, že má přeskočit přes hash MD5, takže třídí pouze názvy souborů, které jsou v poli 2 podle konce řádku sort.

S touto verzí příkazu existuje slabost, protože je pravděpodobné, že bude zmatená, pokud v nich máte nějaké názvy souborů s novými řádky, protože to bude vypadat jako více řádků volání sort. Varianta find -s Tento problém nemá, protože procházení stromu a třídění probíhá ve stejném programu, find.

V každém případě je řazení nutné, aby se zabránilo falešným pozitivům: nejběžnější unixové/Linuxové souborové systémy neudržují výpisy adresářů ve stabilním, předvídatelném pořadí. Možná si to neuvědomíte z použití ls a takových, které tiše třídí obsah adresáře za vás. Volání find bez nějakého třídění jeho výstupu způsobí, že se řádek ve výstupu shoduje bez ohledu na pořadí, v jakém je základní souborový systém vrátí, což způsobí, že tento příkaz dá změněnou hodnotu hash, pokud je pořadí souborů zadáno k tomu při změně vstupu, i když data zůstávají stejná.

Můžete se také zeptat, zda je bit -k 2 V příkazu GNU sort výše nutný. Vzhledem k tomu, že hash dat souboru je odpovídající proxy pro název souboru, dokud se obsah nezmění, nezískáme falešné pozitivy, pokud tuto možnost zrušíme, což nám umožní použít stejný příkaz s oběma GNU a BSD sort Uvědomte si však, že existuje malá šance (1: 2128 s MD5), že přesné řazení názvů souborů neodpovídá částečnému pořadí, které lze provést bez -k 2, pokud dojde ke kolizi hash. Mějte však na paměti, že pokud jsou tak malé šance na nesoulad ve vaší aplikaci, je celý tento přístup pravděpodobně pro vás nepochybný.

Možná budete muset změnit příkazy md5sum Na md5 Nebo jinou hašovací funkci. Pokud zvolíte jinou hashovací funkci a budete potřebovat druhou formu příkazu pro váš systém, možná budete muset odpovídajícím způsobem upravit příkaz sort. Další past je, že některé programy pro sčítání dat vůbec nepíšou název souboru, příkladem je starý unixový program sum.

Tato metoda je poněkud neefektivní, volá md5sum N + 1krát, kde N je počet souborů ve stromu, ale to je nezbytná cena, aby se zabránilo hašování metadat souborů a adresářů.

Možnost 2: Porovnat údaje a metadata

Pokud potřebujete být schopni zjistit, že se cokoli ve stromu změnilo, nejen obsah souboru, požádejte tar o zabalení adresáře obsah pro vás a poté jej odešlete na md5sum:

$ tar -cf - somedir | md5sum

Protože tar také vidí oprávnění k souborům, vlastnictví atd., Budou také detekovány změny v těchto věcech, nejen změny obsahu souboru.

Tato metoda je podstatně rychlejší, protože provede pouze jeden průchod stromem a hashovací program spustí pouze jednou.

Stejně jako u výše uvedené metody find bude tar zpracovávat názvy souborů v pořadí, v jakém je základní souborový systém vrátí. Je možné, že ve své aplikaci si můžete být jisti, že k tomu nedojde. Dokážu si představit alespoň tři různé způsoby použití, pokud je tomu tak pravděpodobně. (Nebudu je uvádět, protože se dostáváme na nespecifikované teritorium chování. Každý souborový systém se zde může lišit, a to i od jedné verze operačního systému k druhému.)

Pokud zjistíte, že máte falešně pozitivní výsledky, doporučuji vám jít s volbou find | cpio V Gillesova odpověď .

215
Warren Young

Kontrolní součet musí být deterministickou a jednoznačnou reprezentací souborů jako řetězce. Deterministický znamená, že pokud umístíte stejné soubory na stejná místa, získáte stejný výsledek. Jednoznačné znamená, že dvě různé sady souborů mají různé reprezentace.

Data a metadata

Vytvoření archivu obsahujícího tyto soubory je dobrý začátek. Jedná se o jednoznačnou reprezentaci (samozřejmě, protože soubory můžete obnovit extrahováním archivu). Může zahrnovat souborová metadata, jako jsou data a vlastnictví. To však ještě není zcela v pořádku: archiv je dvojznačný, protože jeho reprezentace závisí na pořadí, v jakém jsou soubory ukládány, a případně na kompresi.

Řešením je třídit názvy souborů před jejich archivací. Pokud názvy souborů neobsahují nové řádky, můžete spustit find | sort jejich seznam a přidejte je do archivu v tomto pořadí. Dejte pozor, abyste archivátorovi řekli, aby se neobnovoval do adresářů. Zde jsou příklady POSIX pax, GNU tar a cpio:

find | LC_ALL=C sort | pax -w -d | md5sum
find | LC_ALL=C sort | tar -cf - -T - --no-recursion | md5sum
find | LC_ALL=C sort | cpio -o | md5sum

Jména a obsah, nízká technologie

Pokud chcete vzít v úvahu pouze data souboru a ne metadata, můžete vytvořit archiv, který obsahuje pouze obsah souboru, ale neexistují pro to žádné standardní nástroje. Namísto zahrnutí obsahu souboru můžete přidat hash souborů. Pokud názvy souborů neobsahují žádné nové řádky a existují pouze běžné soubory a adresáře (žádné symbolické odkazy nebo speciální soubory), je to celkem snadné, ale musíte se postarat o pár věcí:

{ export LC_ALL=C;
  find -type f -exec wc -c {} \; | sort; echo;
  find -type f -exec md5sum {} + | sort; echo;
  find . -type d | sort; find . -type d | sort | md5sum;
} | md5sum

Kromě seznamu kontrolních součtů přidáváme i seznam adresářů, protože jinak by nebyly prázdné adresáře neviditelné. Seznam souborů je roztříděn (ve specifickém, reprodukovatelném místním prostředí - díky Peterovi.O za to, že mi to připomněl). echo odděluje dvě části (bez tohoto byste mohli vytvořit prázdné adresáře, jejichž jméno vypadá jako md5sum výstup, který může také předávat běžné soubory). Zahrnujeme také seznam velikostí souborů, abychom se vyhnuli útokům s prodloužením délky .

Mimochodem, MD5 je zastaralý. Pokud je k dispozici, zvažte použití SHA-2 nebo alespoň SHA-1.

Jména a data podporující nové řádky v názvech

Zde je varianta výše uvedeného kódu, která se spoléhá na GNU k oddělení názvů souborů nulovými bajty. To umožňuje, aby názvy souborů obsahovaly nové řádky. GNU) obslužné programy pro přehledy uvádějí ve výstupu speciální znaky, takže nebudou existovat nejasné nové řádky.

{ export LC_ALL=C;
  du -0ab | sort -z; # file lengths, including directories (with length 0)
  echo | tr '\n' '\000'; # separator
  find -type f -exec sha256sum {} + | sort -z; # file hashes
  echo | tr '\n' '\000'; # separator
  echo "End of hashed data."; # End of input marker
} | sha256sum

Robustnější přístup

Zde je minimálně testovaný skript Python), který vytváří hash popisující hierarchii souborů. Převezme adresáře a obsah souborů do účtů a ignoruje symbolické odkazy a další soubory a vrací fatální chybu, pokud může jakýkoli soubor nebudu číst.

#! /usr/bin/env python
import hashlib, hmac, os, stat, sys
## Return the hash of the contents of the specified file, as a hex string
def file_hash(name):
    f = open(name)
    h = hashlib.sha256()
    while True:
        buf = f.read(16384)
        if len(buf) == 0: break
        h.update(buf)
    f.close()
    return h.hexdigest()
## Traverse the specified path and update the hash with a description of its
## name and contents
def traverse(h, path):
    rs = os.lstat(path)
    quoted_name = repr(path)
    if stat.S_ISDIR(rs.st_mode):
        h.update('dir ' + quoted_name + '\n')
        for entry in sorted(os.listdir(path)):
            traverse(h, os.path.join(path, entry))
    Elif stat.S_ISREG(rs.st_mode):
        h.update('reg ' + quoted_name + ' ')
        h.update(str(rs.st_size) + ' ')
        h.update(file_hash(path) + '\n')
    else: pass # silently symlinks and other special files
h = hashlib.sha256()
for root in sys.argv[1:]: traverse(h, root)
h.update('end\n')
print h.hexdigest()

Podívejte se na md5deep . Některé z funkcí md5deep, které vás mohou zajímat:

Rekurzivní operace - md5deep dokáže rekurzivně prozkoumat celý strom adresářů. To znamená, že vypočítat MD5 pro každý soubor v adresáři a pro každý soubor v každém podadresáři.

Režim porovnání - md5deep dokáže přijmout seznam známých hashů a porovnat je se sadou vstupních souborů. Program může zobrazit buď ty vstupní soubory, které odpovídají seznamu známých hashů, nebo ty, které se neshodují.

...

14
faultyserver

Pokud je vaším cílem pouze najít rozdíly mezi dvěma adresáři, zvažte použití rozdílu.

Zkuste to:

diff -qr dir1 dir2
11
Deepak Mittal

Můžete hashovat každý soubor rekurzivně a potom hashovat výsledný text:

> md5deep -r -l . | sort | md5sum
d43417958e47758c6405b5098f151074 *-

md5deep je povinné.

7
Pavel Vlasov

řešení :

$ pip install checksumdir
$ checksumdir -a md5 assets/js
981ac0bc890de594a9f2f40e00f13872
$ checksumdir -a sha1 assets/js
88cd20f115e31a1e1ae381f7291d0c8cd3b92fad

funguje rychlé a jednodušší řešení pak bash skriptování.

viz doc: https://pypi.python.org/pypi/checksumdir/1.0.5

5
DmitrySemenov

Pokud v návaznosti na tato vynikající odpověď zjistíte, že chcete urychlit výpočet kontrolního součtu pro velký adresář, zkuste GNU Parallel :

find -s somedir -type f | parallel -k -n 100 md5 {} | md5

(Používáte počítač Mac s md5, Podle potřeby jej vyměňte.)

Příznak -k Je důležitý, protože dává instrukci parallel pokyn k udržování pořádku, jinak se celková částka může změnit tak, aby běžela, i když jsou všechny soubory stejné. -n 100 Říká, že se spustí každá instance md5 Se 100 argumenty, což je parametr, který můžete vyladit pro nejlepší dobu běhu. Viz také příznak -Xparallel (i když v mém osobním případě to způsobilo chybu.)

4
shawkinaw

Tento fragment používám pro střední svazky :

find . -xdev -type f -print0 | LC_COLLATE=C sort -z | xargs -0 cat | md5sum -

a toto pro XXXL :

find . -xdev -type f -print0 | LC_COLLATE=C sort -z | xargs -0 tail -qc100 | md5sum -

3
poige

Pouze obsah souboru , vyjma názvů souborů

Potřeboval jsem verzi, která kontrolovala pouze názvy souborů, protože obsah je uložen v různých adresářích.

Tato verze (Warren Youngova odpověď) hodně pomohla, ale moje verze md5sum vydá název souboru (vzhledem k cestě, ze které jsem příkaz spustil), a názvy složek byly různé, proto i když se jednotlivé kontrolní součty souborů shodovaly, poslední kontrolní součet nebyl.

Abych to napravil, v mém případě jsem potřeboval odstranit název souboru z každého řádku výstupu find (vyberte pouze první slovo oddělené mezerami pomocí cut):

find -s somedir -type f -exec md5sum {} \; | cut -d" " -f1 | md5sum
3
Nicole

nix-hash od správce balíčků Nix

Příkaz nix-hash vypočítá kryptografický hash obsahu každé cesty a vytiskne jej na standardní výstup. Ve výchozím nastavení počítá hash MD5, ale jsou k dispozici také jiné algoritmy hash. Hash je vytištěn v hexadecimálním formátu.

Hash se vypočítá pomocí serializace každé cesty: výpis stromu systému souborů zakořeněné na cestě. To umožňuje hašovat adresáře a odkazy, stejně jako běžné soubory. Výpis je ve formátu NAR vytvořeném programem nix-store --dump. Cesta nix-hash tedy poskytuje stejnou kryptografickou hash jako nix-store - cesta k výpisu | md5sum.

3
user45756

Dobrý stromový kontrolní součet je identifikátor stromu Gitu.

Bohužel není k dispozici žádný samostatný nástroj, který by to dokázal (alespoň to nevím), ale pokud máte po ruce Git, můžete jen předstírat, že založíte nové úložiště a přidat soubory, které chcete zkontrolovat, do indexu.

To vám umožní vytvořit (reprodukovatelný) hash stromu - který zahrnuje pouze obsah, názvy souborů a některé snížené režimy souborů (spustitelné).

2
eckes

Nechtěl jsem nové spustitelné soubory ani neohrabaná řešení, takže je tu moje věc:

#!/bin/sh
# md5dir.sh by Camilo Martin, 2014-10-01.
# Give this a parameter and it will calculate an md5 of the directory's contents.
# It only takes into account file contents and paths relative to the directory's root.
# This means that two dirs with different names and locations can hash equally.

if [[ ! -d "$1" ]]; then
    echo "Usage: md5dir.sh <dir_name>"
    exit
fi

d="$(tr '\\' / <<< "$1" | tr -s / | sed 's-/$--')"
c=$((${#d} + 35))
find "$d" -type f -exec md5sum {} \; | cut -c 1-33,$c- | sort | md5sum | cut -c 1-32
1
Camilo Martin

Skript, který je dobře otestován a podporuje řadu operací, včetně nalezení duplikátů, porovnání dat a metadat, zobrazení doplňků a změn a odstranění, můžete mít rád otisk prst .

Otisk prstu nyní neprodukuje jediný kontrolní součet pro adresář, ale přepisový soubor, který obsahuje kontrolní součty pro všechny soubory v tomto adresáři.

fingerprint analyze

To vygeneruje index.fingerprint v aktuálním adresáři, který obsahuje kontrolní součty, názvy souborů a velikosti souborů. Ve výchozím nastavení používá oba MD5 a SHA1.256.

V budoucnu doufám, že do otisku prstu doplníme podporu pro Merkle Trees, což vám poskytne jediný kontrolní součet nejvyšší úrovně. Momentálně je třeba tento soubor uchovat pro provedení ověření.

1
ioquatix

Jednodílný:

find directory -exec md5sum {} \; 2>&1 | sort -k 2 | md5sum

Seznam všech souborů a adresářů a dostane md5sum pro každého. Pak dostane md5sum za všechno.

Ošemetný bit zde vyřešil, že md5sum není schopen udělat částku pro adresář, ale řekne nám to: md5sum: dir/sub_dir: Is a directory. Právě přesuneme tuto zprávu na standardní výstup.

0
laimison

Dělat individuálně pro všechny soubory v každém adresáři.

# Calculating
find dir1 | xargs md5sum > dir1.md5
find dir2 | xargs md5sum > dir2.md5
# Comparing (and showing the difference)
paste <(sort -k2 dir1.md5) <(sort -k2 dir2.md5) | awk '$1 != $3'
0
Leandro Lima

Migrace do formátu archivu POSIX ovlivňuje GNU) Kontrolní součty na bázi dehtu

Tato odpověď má být doplňkovou aktualizací přístupu k použití Tar výstupu k hašování obsahu adresářů, protože byla navržena (mimo jiné) ve výborných odpovědích Warren Young a Gilles před časem.

Od té doby alespoň openSUSE (od svého vydání 12.2) změnil svůj výchozí GNU formát dehtu z "formátu GNU tar 1.13.x" do (mírně) nadřazeného formátu POSIX 1003.1-2001 (pax) . Také proti proudu (mezi vývojáři GNU Tar), o kterých diskutují, aby provedli stejnou migraci, viz například poslední odstavec na tato stránka z GNU Tar manual :

Výchozí formát pro GNU tar je definován v době kompilace. Můžete jej zkontrolovat spuštěním tar --help A prozkoumáním posledních řádků jeho výstupu. Obvykle GNU tar je nakonfigurován tak, aby vytvářel archivy ve formátu gnu, avšak budoucí verze se přepne na posix.

(Tato stránka také podává pěkný přehled o různých formátech archivů, které jsou k dispozici s GNU Tar.)

V našem případě, kdy jsme dechtovali obsah adresáře a hašovali výsledek, a aniž bychom podnikli konkrétní opatření, má změna z GNU na formát POSIX) následující důsledky:

  • Přes stejný obsah adresáře bude výsledný kontrolní součet odlišný.

  • Přes stejný obsah adresáře se výsledný kontrolní součet liší od spuštění ke spuštění, pokud se použijí výchozí záhlaví pax.

Ten vychází ze skutečnosti, že formát POSIX (pax) zahrnuje rozšířené záhlaví pax, které jsou určeny řetězcem formátu, který je ve výchozím nastavení na %d/PaxHeaders.%p/%f V GNU Tar). , specifikátor %p je nahrazen ID procesu generujícího procesu Tar, který se samozřejmě liší od běhu ke spuštění. Viz tato částGNU Tar manual) a zejména tento pro podrobnosti.

Právě nyní, datující se od roku 2019-03-28, je proti proudu přijat ( commit ), který tento problém ruší.

Abych mohl v daném případě nadále používat GNU Tar), mohu doporučit následující alternativní možnosti:

  • Pomocí možnosti Tar --format=gnu Explicitně řekněte Tarovi, aby vytvořil archiv ve „starém“ formátu. Toto je povinné pro ověření „starých“ kontrolních součtů.

  • Použijte novější formát POSIX, ale explicitně určete vhodnou hlavičku pax, například pomocí --pax-option="exthdr.name=%d/PaxHeaders/%f". To však přeruší zpětnou kompatibilitu se „starými“ kontrolními součty.

Zde je fragment kódu Bash, který pravidelně používám pro výpočet kontrolních součtů obsahu adresářů včetně metadat:

( export LC_ALL=C
  find <paths> ! -type s -print0 |
  sort -z |
  tar cp --format=gnu --numeric-owner \
         --atime-preserve \
         --no-recursion --null --files-from - |
  md5sum --binary; )

Zde je <paths> Nahrazen seznamem mezer oddělených mezerami ve všech adresářích, které chci být pokryty kontrolním součtem. Účel použití národního prostředí C, nulového bajtového oddělení názvů souborů a použití hledání a třídění k získání nezávislého pořadí souborů v archivu nezávislého na souborovém systému je již dostatečně diskutováno v jiných odpovědích.

Okolní závorky ponechávají nastavení LC_ALL Lokální v podshell.

Kromě toho používám výraz ! -type s S find, abych se vyhnul varováním od Tar, které se objevují, pokud jsou soubory soketu součástí obsahu adresáře: GNU Tar není archivní sokety Pokud chcete být informováni o přeskočených soketech, nechte tento výraz pryč.

Používám --numeric-owner S Tar, abych mohl později zkontrolovat kontrolní součty i na systémech, kde nejsou známí všichni vlastníci souborů.

Možnost --atime-preserve Pro Tar je lépe vynechána, pokud některý z <paths> Leží na zařízení připojeném pouze ke čtení. Jinak budete upozorněni na každý jednotlivý soubor, jehož přístupové časové razítko Tar nebylo možné obnovit. Pro zápis povolený <paths> Používám tuto možnost dobře, abych zachoval časová razítka přístupu v hašovaných adresářích.

Možnost Tar --no-recursion, Která byla již použita v Gillesův návrh , zabraňuje Tar v rekurzivním sestupu do adresářů sám a místo toho operuje soubor po souboru na tom, co dostane z tříděného find výstup.

A konečně není pravda, že používám md5sum: Vlastně používám sha256sum.

0
Jürgen

Pomocí následujícího přístupu zjistím, zda se obsah/atributy adresáře změnily:

cd /path/to/dir; ls -lnAR --time-style=+%s . | md5sum

Pokud chcete také sledovat změny v rozšířených atributech:

cd /path/to/dir; (ls -lnAR --time-style=+%s .; getfacl -Rns .) | md5sum

Za normálních okolností není třeba kontrolovat obsah souborů, protože doba modifikace souboru již naznačuje změnu obsahu souboru. Tím se také zrychlí celá operace.

Poznámky:

  • cd/cesta/k/dir - dělá kontrolní součet odolný vůči přemístění adresáře
  • -n - dělá kontrolní součet trvalý napříč systémy s různým mapováním uid/gid
  • -A - zahrnuje všechny soubory včetně tečkovaných (jako -a) s výjimkou. a ..
  • --time-style = +% s - bez toho by změny provedené do 1 minuty po provedení kontrolního součtu mohly zůstat nezměněny, tento výstup je také trvalý mezi kopiemi rsync (na rozdíl od --full-time option)

Pokud chcete i nadále kontrolovat obsah souborů: tar c -C /path/to/dir | md5sum Nebo s rozšířenými atributy: cd /path/to/dir; (tar c .; getfacl -Rns .) | md5sum

Aktualizace:

Aby to fungovalo na širším okruhu systémů, musel jsem nastavit národní prostředí a také odfiltrovat počet pevných odkazů a velikosti adresářů z ls output s awk:

cd /path;LC_ALL=C ls -lnAR --time-style=+%s .|awk '{$2=0;$1~/^d/&&$5=0;print}'|md5sum
0
Alek

Robustní a čistý přístup

  • Nejdříve první nedostupnou dostupnou paměť ! Místo toho, abyste celý soubor nakrmili, uložte soubor do bloků.
  • Různé přístupy k různým potřebám/účelu (všechny níže uvedené nebo si vyberte, co kdy platí):
    • Skryjte pouze název záznamu všech záznamů ve stromu adresářů
    • Hash obsah souboru všech záznamů (ponechání meta jako, inode číslo, ctime, atime, mtime, velikost, atd., Dostanete nápad)
    • Pro symbolický odkaz je jeho obsahem jméno referenta. Hash to nebo zvolit přeskočit
    • Při hašování obsahu položky následujte nebo nesledujte (vyřešený název) symbolický odkaz
    • Pokud se jedná o adresář, jeho obsah jsou pouze položky adresáře. Při rekurzivním procházení budou nakonec hashovány, ale měly by být názvy položek adresáře této úrovně hashed pro označení tohoto adresáře? Užitečné v případech použití, kdy je nutné hash rychle identifikovat změnu, aniž byste museli hluboce procházet, aby obsah hash byl. Příkladem by mohla být změna názvu souboru, ale zbytek obsahu zůstává stejný a všechny jsou poměrně velké soubory
    • Zacházejte s velkými soubory dobře (opět pamatujte na RAM)
    • Zacházejte s velmi hlubokými adresářovými stromy (dbejte na otevřené popisovače souborů)
    • Zacházejte s nestandardními názvy souborů
    • Jak postupovat se soubory, které jsou sokety, potrubí/FIFO, blokovat zařízení, char zařízení? Musíte je také hashovat?
    • Neaktualizujte přístupový čas u žádného záznamu během procházení, protože to bude vedlejší účinek a kontraproduktivní (intuitivní?) Pro určité případy použití.

To je to, co mám na hlavě, každý, kdo na tom strávil nějaký čas, by chytil jiné gotky a rohové pouzdra.

Tady je nástroj (Zřeknutí se odpovědnosti: Jsem přispěvatelem) dtreetrawl , velmi lehká paměť, která řeší většinu případů, může být trochu drsná kolem okrajů, ale byla docela užitečná.

Usage:
  dtreetrawl [OPTION...] "/trawl/me" [path2,...]

Help Options:
  -h, --help                Show help options

Application Options:
  -t, --terse               Produce a terse output; parsable.
  -d, --delim=:             Character or string delimiter/separator for terse output(default ':')
  -l, --max-level=N         Do not traverse tree beyond N level(s)
  --hash                    Hash the files to produce checksums(default is MD5).
  -c, --checksum=md5        Valid hashing algorithms: md5, sha1, sha256, sha512.
  -s, --hash-symlink        Include symbolic links' referent name while calculating the root checksum
  -R, --only-root-hash      Output only the root hash. Blank line if --hash is not set
  -N, --no-name-hash        Exclude path name while calculating the root checksum
  -F, --no-content-hash     Do not hash the contents of the file

Příklad lidsky přívětivého výstupu:

...
... //clipped
...
/home/lab/linux-4.14-rc8/CREDITS
        Base name                    : CREDITS
        Level                        : 1
        Type                         : regular file
        Referent name                :
        File size                    : 98443 bytes
        I-node number                : 290850
        No. directory entries        : 0
        Permission (octal)           : 0644
        Link count                   : 1
        Ownership                    : UID=0, GID=0
        Preferred I/O block size     : 4096 bytes
        Blocks allocated             : 200
        Last status change           : Tue, 21 Nov 17 21:28:18 +0530
        Last file access             : Thu, 28 Dec 17 00:53:27 +0530
        Last file modification       : Tue, 21 Nov 17 21:28:18 +0530
        Hash                         : 9f0312d130016d103aa5fc9d16a2437e

Stats for /home/lab/linux-4.14-rc8:
        Elapsed time     : 1.305767 s
        Start time       : Sun, 07 Jan 18 03:42:39 +0530
        Root hash        : 434e93111ad6f9335bb4954bc8f4eca4
        Hash type        : md5
        Depth            : 8
        Total,
                size           : 66850916 bytes
                entries        : 12484
                directories    : 763
                regular files  : 11715
                symlinks       : 6
                block devices  : 0
                char devices   : 0
                sockets        : 0
                FIFOs/pipes    : 0
0
six-k

Pokud nepotřebujete md5, můžete to zkusit

find . -type f | xargs cksum | cksum
0
Martin Koubek