我可以用Perl获取目录的MD5sum吗?

我可以用Perl获取目录的MD5sum吗?,perl,md5,checksum,Perl,Md5,Checksum,我正在编写一个Perl脚本(在Windows中),它使用File::Find为网络文件系统编制索引。它工作得很好,但是对文件系统进行爬网需要很长时间。我在想,在遍历一个目录之前,以某种方式获取该目录的校验和会很好,如果校验和与上一次运行时获取的校验和匹配,则不要遍历该目录。这将消除大量处理,因为此文件系统上的文件不会经常更改 在我的AIX设备上,我使用以下命令: csum -h MD5 /directory 返回如下内容: 5cfe4faf4ad739219b6140054005d506 /

我正在编写一个Perl脚本(在Windows中),它使用File::Find为网络文件系统编制索引。它工作得很好,但是对文件系统进行爬网需要很长时间。我在想,在遍历一个目录之前,以某种方式获取该目录的校验和会很好,如果校验和与上一次运行时获取的校验和匹配,则不要遍历该目录。这将消除大量处理,因为此文件系统上的文件不会经常更改

在我的AIX设备上,我使用以下命令:

csum -h MD5 /directory
返回如下内容:

5cfe4faf4ad739219b6140054005d506  /directory
sub dirModified($){
    my $dir = @_[0];
    opendir(DIR, "$dir");
    my @dircontents = readdir(DIR);
    closedir(DIR);

    foreach my $item (@dircontents){
        if( -f $item ){
            print -M $item . " : $item - do stuff here\n";
        } elsif( -d $item && $item !~ /^\.+$/ ){
            dirModified("$dir/$item");
        }
    }
}
该命令只需很少的时间:

time csum -h MD5 /directory
5cfe4faf4ad739219b6140054005d506  /directory

real    0m0.00s
user    0m0.00s
sys     0m0.00s
我在CPAN中搜索了一个模块来实现这一点,但看起来所有模块都会为目录中的每个文件提供MD5sum,而不是目录本身

有没有一种方法可以在Perl中获取目录的MD5sum,或者甚至在Windows中获取MD5sum,因为我可以从Perl调用Win32命令


提前谢谢

为了获得校验和,您必须读取文件,这意味着您需要遍历文件系统,这将使您回到您试图摆脱的同一条船上

您能读取文件和文件夹的上次修改日期吗?当然,这将比构建MD5更快?

据我所知,您无法获得目录的MD5。当您提供目录时,其他系统上的md5sum会抱怨。csum最有可能为您提供顶级目录的目录文件内容的哈希,而不是遍历树

通过执行以下操作,您可以获取文件的修改时间,并以您喜欢的方式对其进行散列:

5cfe4faf4ad739219b6140054005d506  /directory
sub dirModified($){
    my $dir = @_[0];
    opendir(DIR, "$dir");
    my @dircontents = readdir(DIR);
    closedir(DIR);

    foreach my $item (@dircontents){
        if( -f $item ){
            print -M $item . " : $item - do stuff here\n";
        } elsif( -d $item && $item !~ /^\.+$/ ){
            dirModified("$dir/$item");
        }
    }
}

是的,它需要一些时间来运行。

除了其他好的答案之外,让我补充一下:如果您想要校验和,请使用a而不是()

我不认为您不需要在文件索引器中使用加密安全的哈希函数——相反,您需要一种在不存储整个列表的情况下查看目录列表中是否有更改的方法。校验和算法就是这样做的:当输入发生变化时,它们返回不同的输出。因为它们比散列函数简单,所以它们可能做得更快

确实,用户可以以校验和无法发现的方式更改目录。但是,用户必须故意这样更改文件名,因为文件名的正常更改(很可能)会给出不同的校验和。那么,是否有必要防范这种“攻击”


你应该总是考虑每一次攻击的后果并选择合适的工具。

< P>我在Python中做了其中的一个,如果你感兴趣的是:


那么,AIX的一个特性是允许“csum”命令不在文件系统中运行吗?可能是在目录上使用了修改过的时间戳?因为我上面发布的示例在1.5TB的文件系统上花费了“0”秒。csum命令对文件进行操作,目录就是文件,所以它是将目录作为文件进行校验和(即,不是递归)。在运行csum的子目录中添加一个文件。您仍然应该看到相同的校验和。您也可以尝试将一些数据附加到一个已经存在的文件中,这也不会改变校验和(目录只包含名称,元数据存储在索引节点中)。好的-我接触了较低子目录中的一个文件,您是正确的,校验和没有改变。但即使这样也会对我有所帮助——如果我在最低的子目录下,我希望对该目录进行校验和,因为这样我就不必读取该目录中的所有文件。有没有办法用Perl做到这一点?校验和也只会告诉您文件名是否已更改。它们的内容可能完全不同。因此,Perl等价物是使用Digest::md5中的md5_hex和列出目录中每个文件的文件globs中的排序值:md5_hex join“”,sort,csum的手册页有误导性:“csum命令使用指定的哈希算法计算指定文件的消息摘要。这为验证文件完整性提供了可靠的方法。“-这并没有让我相信它是在散列元数据。尽管它可能是-不反驳你的说法,我只是说manpage并没有让它听起来像那样。我没有AIX box,但它的FS不可能保留其内容的md5摘要。如果您尝试对目录进行cat,会发生什么情况?对目录进行cat会生成一个(有点混乱的)文件列表,该列表立即位于目录中(但不在任何子目录中)。这可能是一个很好的机会,类似的东西被用于MD5sum。