【问题标题】:Bitwise comparision of two directories(files) in PerlPerl中两个目录(文件)的按位比较
【发布时间】:2012-03-18 06:19:15
【问题描述】:

我正在尝试使用 perl 实现以下功能

对两个目录中的文件进行按位比较的脚本 (目录名称作为参数传递给命令行中的脚本)。 该脚本应该从第一个目录和所有子目录中读取所有文件,并且 将它们与相应的文件(例如具有相同名称的文件)进行比较 第二个目录。

脚本的结果 - (PASSED or FAILED) 是根据以下方式形成的: 当第一个目录中的至少一个文件不是按位时,结果为 FAILED 等于第二个目录或第二个目录对应的文件 没有对应的文件。 否则测试通过。

到目前为止,我已经尝试了我创建的这个线程中的方法 - Comparing two directories using Perl 。过了一段时间后,我意识到我实际上是在尝试模拟“diff -r dir1 dir2”,这不是目标,如何对两个目录执行按位比较操作?

EDIT: Test Case

  /dir1                       /dir2
       -- file1                   -- file1 
       -- file2                   -- file2  
       -- file3 
       -- ....
       -- ...
       ---/subDir1
            --file1
            --file2

file1 of dir1 contains :- foo bar
file1  of dir2 contains :- foo 
Result - Fail

file1  of dir1 contains :- foo bar
file1  of dir2 contains :- foo bar
Result - Pass.

脚本本质上应该提取存在于不同目录中的同名文件。

【问题讨论】:

标签: perl bit-manipulation


【解决方案1】:

我会这样做:

  1. 打开目录1
  2. 将所有文件名读入一个数组
  3. 打开目录2
  4. 将所有文件名读入一个数组
  5. 如果 dir1 中的文件名与 dir2 中的文件名匹配,反之亦然,开始比较逻辑
  6. 使用 Digest::MD5 here 对两个文件执行 MD5 比较。如果甚至关闭了一位,您将获得不同的校验和。

来自 Digest::MD5 的代码示例...

 use Digest::MD5 qw(md5 md5_hex md5_base64);
 $digest = md5($data);
 $digest = md5_hex($data);
 $digest = md5_base64($data);
 # OO style
 use Digest::MD5;
 $ctx = Digest::MD5->new;
 $ctx->add($data);
 $ctx->addfile(*FILE);
 $digest = $ctx->digest;
 $digest = $ctx->hexdigest;
 $digest = $ctx->b64digest;

为每个文件生成一个 MD5 哈希并比较它们,然后相应地通过或失败。

【讨论】:

  • 这对于大目录来说可能相当昂贵。我会检查 stat 之类的东西,看看他们是否甚至可以有匹配的摘要。例如,如果它们的大小不同,您就已经知道它们是不同的。
  • 为什么要计算只使用一次的哈希?比较每个字节然后计算它们的 MD5 哈希值更便宜、更准确,特别是因为在比较字节时一旦遇到差异就可以停止。当将一个文件与许多文件与许多文件进行比较时,以及要比较的文件不在同一个系统上时,哈希很有用。
  • 没错,这在很大程度上取决于您拥有多少文件以及它们有多大。如果我们谈论的是几百个小文件,您可以在几秒钟内生成散列和比较。 TB 级数据?没那么容易。我只是建议将其作为一种非常简单的方法来比较两个文件,看看它们是否相同,使用众所周知的和有据可查的 MD5 工具。 YMMV。 :)
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2015-07-08
  • 2018-09-05
  • 2014-06-14
  • 2014-05-31
相关资源
最近更新 更多