Genera checksum md5 per tutti i file in una directory

59

Vorrei creare un elenco di checksum md5 per tutti i file in una directory.

Voglio cat filename | md5sum > ouptput.txt . Voglio farlo in 1 step per tutti i file nella mia directory.

Qualsiasi assistenza sarebbe grande.

    
posta Walter Wayne Leutwyler 10.07.2013 - 16:24

3 risposte

90

Puoi passare md5sum a più nomi di file o espansioni 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

Se vuoi divertirti, puoi usare cose come find per visualizzare in dettaglio e filtrare i file, oltre a lavorare in modo ricorsivo:

find -type f -exec md5sum "{}" + > checklist.chk
    
risposta data Oli 10.07.2013 - 16:28
9

Un ottimo programma di creazione / verifica del checksum è rhash. Crea anche file compatibili con SFV e li controlla anche.

Supporta md4, md5, sha1, sha512, crc32 e molti altri.

Inoltre può fare la creazione ricorsiva (opzione -r) come md5deep o sha1deep.

Ultimo ma non meno importante è possibile formattare l'output del file di checksum; ad esempio:

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

genera un file CSV che include il percorso completo dei file ricorsivamente a partire dalla directory /home .

Trovo estremamente utile anche l'opzione -e rinomina i file inserendo la somma crc32 nel nome.

Puoi cambiare "md5sum" con "rhash" negli esempi PhoenixNL72.

    
risposta data Marcolino 27.05.2014 - 11:34
5

Ecco altri due esempi completi:

  1. Crea un file md5 in ogni directory che non ne ha già uno, con percorsi assoluti:

    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. Crea un file md5 in ogni cartella che non ne ha già uno: nessun percorso, solo nomi di file:

    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 
    

Ciò che differisce tra 1 e 2 è il modo in cui i file vengono presentati nel file md5 risultante.

I comandi eseguono le seguenti operazioni:

  1. Crea un elenco di nomi di directory per la cartella corrente. (Albero)
  2. Ordina l'elenco delle cartelle.
  3. Controlla in ogni directory se esiste il file @ md5sum.md5. Uscita saltata se esiste, uscita Elaborazione se non esiste.
  4. Se il file @ md5Sum.md5 non esiste, md5Sum ne genererà uno con i checksum di tutti i file nella cartella. 5) Imposta il file @ md5Sum.md5 generato in sola lettura.

L'output di questo intero script può essere reindirizzato a un file (.....; done & gt; test.log) o inviato a un altro programma (come grep). L'output ti dirà solo quali directory sono state ignorate e quali sono state elaborate.

Dopo un'esecuzione corretta, si finisce con un file @ md5Sum.md5 in ogni sottodirectory della directory corrente

Ho chiamato il file @ md5Sum.md5 quindi verrà elencato nella parte superiore della directory in una condivisione samba.

La verifica di tutti i file @ md5Sum.md5 può essere effettuata con i comandi successivi:

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

Successivamente, puoi grep checklog.txt usando grep -v OK per ottenere un elenco di tutti i file che differiscono.

Per rigenerare un @ md5Sum.md5 in una directory specifica, quando hai modificato o aggiunto file per esempio, elimina il file @ md5Sum.md5 o rinominalo ed esegui di nuovo il comando generate.

    
risposta data PhoenixNL72 31.07.2013 - 19:00

Leggi altre domande sui tag