2012-12-08 21 views
6

Sto cercando dei modi per ottenere i checksum dei file in Perl ma non eseguendo il comando di sistema cksum - vorrebbe farlo in Perl stesso perché lo script deve essere portatile tra UNIX e Finestre. cksum <FILENAME> | awk '{ print $1 }' funziona su UNIX ma ovviamente non su Windows. Ho esplorato MD5 ma sembra che sia necessario ottenere un handle di file e in generale non sembra un modo molto compatto per ottenere quei dati (preferibile un solo liner).Modo compatto per ottenere il checksum dei file in Perl

C'è un modo migliore?

risposta

12

Qui ci sono tre modi diversi a seconda che i moduli che avete a disposizione:

use Digest::MD5 qw(md5_hex); 

use File::Slurp; 
print md5_hex(read_file("filename")), "\n"; 

use IO::All; 
print md5_hex(io("filename")->all), "\n"; 

use IO::File; 
print md5_hex(do { local $/; IO::File->new("filename")->getline }), "\n"; 

Non del tutto una riga, ma abbastanza vicino.

Sostituire Digest::MD5 con qualsiasi algoritmo di hash che si desidera, ad es. SHA1.

IO::File è nel core e dovrebbe essere disponibile ovunque, ma questa è la soluzione che personalmente non mi piace di più. Comunque, funziona.

+0

Non riesco a trovare File :: Slurp in 'ppm' – amphibient

+3

OK - ha funzionato in questo modo' open (HANDLE, "<", $ dirItemPath); my $ cksum = md5_hex (); ' – amphibient

+0

Ho aggiornato le mie risposte con più opzioni. –

1

Questo funziona anche:

use Digest::MD5 qw(md5_base64); 
... 
      open(HANDLE, "<", $dirItemPath); 
      my $cksum = md5_base64(<HANDLE>); 
      print "\nFile checksum = ".$cksum; 
5

non ho potuto fare qualsiasi parte del lavoro di cui sopra per me in finestre, vorrei sempre avere una MD5 non corretta. Ho avuto il sospetto che fosse causato da differenze nel linebreak, ma la conversione del file in DOS o in Unix non ha fatto alcuna differenza. Lo stesso codice con lo stesso file mi darebbe la risposta giusta su Linux e quella sbagliata in Windows. Leggendo la documentazione, ho finalmente trovato qualcosa che avrebbe funzionato sia in Windows e Linux:

use Digest::MD5; 
open ($fh, '<myfile.txt'); 
binmode ($fh); 
print Digest::MD5->new->addfile($fh)->hexdigest; 

Spero che questo aiuta altre persone che hanno difficoltà a finestre, trovo così strano che non ho trovato alcuna menzione ai problemi su windows ...