Genera checksum md5 per tutti i file in una directory


75

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

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

Qualsiasi assistenza sarebbe ottima.


Come posso trovare md5sum (checksum) di un file di backup specifico? -Che aspetto dovrebbe avere il mio script-qual è il comando per questo

Risposte:


110

Puoi passare md5sumpiù nomi di file o espansioni di 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 il finddrill down e il filtro dei file, oltre a lavorare in modo ricorsivo:

find -type f -exec md5sum "{}" + > checklist.chk

1
♦ come usare quanto sopra per ottenere md5sumi file all'interno delle sottodirectory, le md5sum *emissioni di cui sopra vanno nel livello della sottodirectory dicendo ... è una directory
Kasun Siyambalapitiya,

find -type f -exec md5sum '{}' +Ci scusiamo per averlo chiesto eseguendo e 'find -type f -exec md5sum' {} '`Sono stato in grado di ottenerlo. Grazie :)
Kasun Siyambalapitiya,

Preferisco di più l'aspetto di questa uscita:openssl md5 * > checklist.txt
ashley,

1
Se stai usando una shell che è felice di valutare **ricorsivamente (come zsh), è ancora più semplice:md5sum **/* 2>/dev/null
Joost

12

Un ottimo programma di creazione / verifica di 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, puoi formattare l'output del file checksum; per esempio:

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

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

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

È possibile modificare "md5sum" con "rhash" negli esempi PhoenixNL72.


1
Cosa fa esattamente '/ home /' qui? Questo strumento sembra abbastanza buono.
Andy Ibanez,

Penso che sia un errore, sicuramente errori per me. -P è il formato per l'output. Lo correggerò.
pbhj

7

Ecco altri due esempi:

  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 abbia 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 sono 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. Controllare in ogni directory se esiste il file @ md5sum.md5. Output Ignorato se esiste, output Elaborazione se non esiste.
  4. Se il file @ md5Sum.md5 non esiste, md5Sum genererà uno con i checksum di tutti i file nella cartella. 5) Impostare il file @ md5Sum.md5 generato in sola lettura.

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

Dopo una corretta esecuzione, si finirà con un file @ md5Sum.md5 in ogni sottodirectory della directory corrente

Ho chiamato il file @ md5Sum.md5 in modo che venga elencato nella parte superiore della directory in una condivisione samba.

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

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

Successivamente è possibile eseguire grep su 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, ad esempio quando si sono modificati o aggiunti file, eliminare il file @ md5Sum.md5 o rinominarlo ed eseguire nuovamente il comando generate.


Comando n. 1 utilizzando percorsi completi: md5sum "$ {dir}" / * non sta rilevando i file nascosti che iniziano con il punto. Qualche rimedio?
user14654,

In ritardo alla festa, ma poiché md5sum vuole i nomi dei file (sembra scontento se gli dai una directory), potrebbe essere più facile chiedere aiuto: $ md5sum $ (trova "$ dir" -maxdepth 0 -type f) Il "- type f "estrae i file regolari e .hidden (inoltre, find ha molte opzioni, ma può essere super utile). Ometti la parte "-maxdepth 0" se vuoi tutto ricorsivamente. Nota: questo è fragile se i nomi dei file hanno spazi incorporati, quindi puoi leggere su xargs e -0 ( en.wikipedia.org/wiki/Xargs )
jgreve

0

Ho risolto questo problema e, sebbene le soluzioni di cui sopra siano eleganti, volevo un trucco rapido e sporco per questa situazione: 1 directory, con sottodirectory un livello profondo al suo interno.

Quindi, inserisci la directory in una shell ed esegui:

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

Ciò ottiene tutti i file nella directory di livello superiore, rimuove l'avviso di errore relativo alle directory secondarie che sono directory e quindi esegue md5sums sul contenuto della sottodirectory. Vantaggio: facile da ricordare, fa esattamente quello che dovrebbe fare. Sono sempre confuso da trovare la sintassi e non riesco mai a ricordarmelo dalla testa, quindi non c'è bisogno di fare un ciclo ecc., Occupandosi degli spazi nei nomi delle directory, questa riga ha funzionato bene. Non è una soluzione potente e affidabile, non va bene per> 1 livello di sottodirectory, ma una soluzione rapida e semplice per il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.