如何编写Perl脚本来计算目录中每个文件的MD5总和?

时间:2013-10-19 00:29:51

标签: perl unix md5 md5sum

有没有办法编写Perl脚本来计算目录中每个文件的MD5sum?

如果是这样,我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

有很多方法可以做到这一点,但它归结为你需要预先形成的两个操作。您首先需要找到要运行检查的文件列表,然后您需要对每个文件运行md5sum检查。有很多方法可以做到这一点,但以下内容应该可以满足您的需求。

#!/usr/bin/perl

use strict;
use warnings;
use Digest::MD5 qw(md5_hex);

my $dirname = "/home/mgreen/testing/";
opendir( DIR, $dirname );
my @files = sort ( grep { !/^\.|\.\.}$/ } readdir(DIR) );
closedir(DIR);

print "@files\n";

foreach my $file (@files) {
    if ( -d $file || !-r $file ) { next; }
    open( my $FILE, $file );
    binmode($FILE);
    print Digest::MD5->new->addfile($FILE)->hexdigest, " $file\n";
    close($FILE);
}

上面将获取目录中每个文件的md5sum并跳过任何子目录并将其打印到STDOUT。 MD5校验和部分由Digest::MD5模块完成,这最终是我认为您正在寻找的。

我确实喜欢你的问题,因为它是开放式的,有很多可能的解决方案,如所有“我如何在perl中这样做?”问题所以我相信你会得到很多可能的解决方案,我很可能会在以后回家时更新我的​​。

答案 1 :(得分:0)

也许使用find-exec可以完成这项工作吗?

find . -name "*.*" -exec md5sum '{}' \; 

'{}'将替换为每个文件的名称。

答案 2 :(得分:0)

使用opendirreaddir或其他recursive method。 这是一个例子:

#!/usr/bin/perl -w
use warnings;
my $DIR_PATH="a";
opendir DIR, ${DIR_PATH} or die "Can not open \"$DIR_PATH\"\n";
@filelist = readdir DIR;


foreach $file (@filelist) {
  open(IN,"a/$file")or die "cannot open";
  while(<IN>){...}
  close IN;
}