2012-12-08 9 views
6

Ich suche nach Möglichkeiten, Dateiprüfsummen in Perl aber nicht durch Ausführen des Systembefehls cksum zu erhalten - möchte es in Perl selbst tun, weil das Skript zwischen UNIX und Windows. cksum <FILENAME> | awk '{ print $1 }' funktioniert unter UNIX, aber offensichtlich nicht in Windows. Ich habe MD5 erforscht, aber es scheint, als ob ein Datei-Handle notwendig ist und im Allgemeinen scheint es keine sehr kompakte Möglichkeit zu sein, diese Daten zu erhalten (Ein-Liner vorzuziehen).Kompakte Möglichkeit, Dateiprüfsumme in Perl

Gibt es einen besseren Weg?

Antwort

12

Hier sind drei verschiedene Möglichkeiten, je nachdem, welche Module Sie zur Verfügung haben:

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"; 

nicht vollständig einzeilige aber ziemlich nah dran.

Ersetzen Sie Digest::MD5 durch einen beliebigen Hash-Algorithmus, z. SHA1.

IO::File ist im Kern und sollte überall verfügbar sein, aber das ist die Lösung, die ich persönlich am meisten mag. Wie auch immer, es funktioniert.

+0

Ich konnte nicht finden Datei :: Slurp in 'ppm' – amphibient

+3

es ist in Ordnung - es funktionierte so offen (HANDLE, <", $ dirItemPath); mein $ cksum = md5_hex (); ' – amphibient

+0

Ich habe meine Antworten mit mehr Optionen aktualisiert. –

1

Dies funktioniert auch:

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

ich nicht eine der oben genannten Arbeit für mich in den Fenstern machen könnte, würde ich immer eine falsche MD5 bekommen. Ich wurde argwöhnisch, dass es durch Unterschiede im Zeilenumbruch verursacht wurde, aber die Konvertierung in DOS oder Unix machte keinen Unterschied. Der gleiche Code mit der gleichen Datei würde mir die richtige Antwort auf Linux und die falsche Antwort in Windows geben. Lesen Sie die Dokumentation, fand ich endlich etwas, das sowohl in Windows und Linux funktionieren würde:

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

Ich hoffe, das anderen Menschen hilft, Schwierigkeiten haben, in den Fenstern, finde ich es so seltsam, dass ich nicht finden irgendwelche Probleme erwähnt auf Windows ...