有没有办法编写 Perl 脚本来计算目录中每个文件的 MD5sum?
如果是这样,我该怎么做?
好吧,有很多方法可以做到这一点,但归结为您需要执行的两个操作。您首先需要找到要运行检查的文件列表,然后需要对每个文件运行 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 中做到这一点?” 问题所以我相信你会得到很多可能的解决方案,我很可能会在我稍后回家时更新我的解决方案。
使用opendir
和readdir
或其他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;
}
也许使用find
with-exec
可以完成这项工作?
find . -name "*.*" -exec md5sum '{}' \;
'{}' 将替换为每个文件的名称。