PDA

Visualizza la versione completa : Programma per confrontare md5


spqr
09-05-2009, 19:20
Devo confrontare una quantità notevole di files (ppt nella fattispecie) per vedere se ci sono doppioni ed eventualmente eliminarli.
Confrontare i codici md5 uno per uno è un po' scomodo, sapete se esiste qualche utility che possa aiutarmi?

vortex87
09-05-2009, 19:58
Io userei la shell.
Considera che sono su Windows, quindi non posso provare se quanto scrivo funziona, in linea di massima comunque dovrebbe essere un metodo valido, anche se probabilmente avrà bisogno di qualche aggiustamento:



#!/bin/bash

for f in *.ppt; do
md5sum $f >> lista.txt
done

for f in *.ppt; do
md5=$(md5sum $f | awk '{print $1}')
if [ $(grep "$md5" lista.txt | wc -l) -gt 1 ]; then
echo "Doppione:"
grep "$md5" lista.txt
fi
done


In teoria ti segnalerà 2 volte ogni doppione (ovvero ogni volta che incontra uno dei file doppi).

spqr
09-05-2009, 20:55
Grazie vortex, intendevo proprio qualcosa di simile.
Purtroppo non sono in grado di fare da solo gli aggiustamenti (nella mia lista di cose da fare c'è "imparare bash" da circa 2 anni ma ancora non ho iniziato :mame: ).
Se hai tempo e voglia i punti sono questi:

-Penso ci sia qualche problema con i file che hanno un nome con lo spazio, tipo per "file uno.ppt" mi dà:
md5sum: file: No such file or directory
md5sum: uno: No such file or directory
etc

-Inoltre mi servirebbe confrontare anche file che si trovano in 2 cartelle differenti.

vortex87
09-05-2009, 21:13
#!/bin/bash

for f in *.ppt; do
md5sum "$f" >> lista.txt
done

for f in *.ppt; do
md5=$(md5sum "$f" | awk '{print $1}')
if [ $(grep "$md5" lista.txt | wc -l) -gt 1 ]; then
echo "Doppione:"
grep "$md5" lista.txt
fi
done


Mettendo $f tra virgolette si dovrebbe risolvere il problema degli spazi.

Le cartelle sono completamente distinte o sono sotto una radice comune?

spqr
09-05-2009, 21:17
Originariamente inviato da vortex87


#!/bin/bash

for f in *.ppt; do
md5sum "$f" >> lista.txt
done

for f in *.ppt; do
md5=$(md5sum "$f" | awk '{print $1}')
if [ $(grep "$md5" lista.txt | wc -l) -gt 1 ]; then
echo "Doppione:"
grep "$md5" lista.txt
fi
done


Mettendo $f tra virgolette si dovrebbe risolvere il problema degli spazi.

Le cartelle sono completamente distinte o sono sotto una radice comune?

Il percorso delle 2 directory è indifferente, posso metterle dove voglio ma l'importante è che siano 2 cartelle distinte.
Con le virgolette funziona, grazie!

vortex87
09-05-2009, 21:19
Beh allora la cosa più comoda è metterle entrambe nella stessa radice (che per comodità contiene solo quelle 2 directory) e modificare così lo script:



#!/bin/bash

for f in */*.ppt; do
md5sum "$f" >> lista.txt
done

for f in */*.ppt; do
md5=$(md5sum "$f" | awk '{print $1}')
if [ $(grep "$md5" lista.txt | wc -l) -gt 1 ]; then
echo "Doppione:"
grep "$md5" lista.txt
fi
done


Forse :stordita:

spqr
09-05-2009, 21:26
Perfetto e comodissimo, grazie mille vortex!
Sapersi orientare col bash è veramente la svolta...

vortex87
09-05-2009, 21:28
Originariamente inviato da spqr
Perfetto e comodissimo, grazie mille vortex!
Sapersi orientare col bash è veramente la svolta...

Prego :D

Eh sì, una volta imparate almeno le basi, per certe cose è una comodità unica :D
Nel caso: http://www.pluto.it/files/ildp/guide/abs/index.html :stordita:

spqr
09-05-2009, 21:30
Un paragrafo al giorno toglie il forum di torno... :stordita:
Grazie anche del materiale, ciao! :D

Loading