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.
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.
Risposte:
Puoi passare md5sum
più 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 find
drill down e il filtro dei file, oltre a lavorare in modo ricorsivo:
find -type f -exec md5sum "{}" + > checklist.chk
md5sum
i file all'interno delle sottodirectory, le md5sum *
emissioni di cui sopra vanno nel livello della sottodirectory dicendo ... è una directory
find -type f -exec md5sum '{}' +
Ci scusiamo per averlo chiesto eseguendo e 'find -type f -exec md5sum' {} '`Sono stato in grado di ottenerlo. Grazie :)
openssl md5 * > checklist.txt
**
ricorsivamente (come zsh), è ancora più semplice:md5sum **/* 2>/dev/null
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 /home
directory.
Trovo estremamente utile anche l'opzione -e rinominare i file inserendo la somma crc32 nel nome.
È possibile modificare "md5sum" con "rhash" negli esempi PhoenixNL72.
Ecco altri due esempi:
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
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:
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.
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.