计算目录的MD5校验和


29

我正在寻找一种比较目录内容的快速方法。是否可以对整个目录执行md5sum(或等效的校验和)?

使用Ubuntu Linux


您可能还想研究使用diff比较目录,这实际上将向您显示目录的不同之处。 unixtutorial.org/2008/06/how-to-compare-directories-in-unix
Kibbee

@Kibbee为避免这种情况,您需要考虑每个文件的数据内容以外的其他内容以及确切地校验文件的方式。给定的:[校验和] 1. A(目录) -File1 [ABC]-File2 [CBA] 2. B(目录) -File1 [ABC] -B1(目录) -File2 [CBA] 3. C(目录) -File4 [ABC]-File5 [CBA] 4. D(目录) -File1副本[ABC]-File2副本[CBA]目录AB虽然包含相同的文件,但它们并不相同(尽管在B1中File2在子目录中) 。在您的示例中,AC将被视为相同,因为
雅各布·莱尔斯

Answers:


36

当然- md5sum directory/*

如果您需要一些更灵活的功能(例如,用于目录递归或哈希比较),请尝试md5deep。

apt-get install md5deep
md5deep -r directory

要比较目录结构,可以为它提供一个哈希表列表以进行比较:

md5deep -r -s /directory1 > dir1hashes
md5deep -r -X dir1hashes /directory2

这将输出目录2中与目录1不匹配的所有文件。

这不会显示已从目录1中删除的文件或已添加到目录2中的文件。


不是我的意思,而是我想要的:)我的意思是递归的,最后得到一个哈希,但是我认为可以使用md5deep -l并哈希输出本身来完成。
pufferfish

1
哈希的顺序不一致,因此必须在哈希之前对输出进行排序
pufferfish

1
为了得到一个确定的顺序,使用-j0它禁用多线程(请参见手册页)。
2014年

1
@ ShaneMadden♦我安装md5deepsudo apt-get install md5deepon,Ubuntu 16.04但是当我尝试阅读手册页时,它告诉我> md5deep没有手动输入
Kasun Siyambalapitiya

27

如果您想查看两个目录之间的区别(如果有的话),那么rsync非常适合。

rsync --archive --dry-run --checksum --verbose /source/directory/ /destination/directory

这将列出所有不同的文件。


2
diff -qr /source/directory/ /destination/directory/还会显示不同的文件。
Konerak 2011年

有没有一种方法可以执行按位比较而不是校验和?在本地驱动器上可能更快。
阿里

非常好。如果源或目标也是远程文件夹,则可以使用,例如username@hostname:/destination/directory
Thalis K.17.18.17

11

我想我以前用这个答案回答过这个:

find . -xtype f -print0 | xargs -0 sha1sum | cut -b-40 | sort | sha1sum

给出: b1a5b654afee985d5daccd42d41e19b2877d66b1

想法是,您对所有文件进行哈希处理,每行切出一个哈希,对它们进行排序并进行哈希处理,从而产生一个哈希。这不取决于文件的名称。


5

CFV应用程序是非常有用的,它不仅可以检查并创建MD5校验和,它也可以做CRC32,SHA1,激流,PAR,PAR2。

为当前目录中的所有文件创建CRC32校验和文件:

cfv -C

为当前目录中的所有文件创建一个MD5校验和文件:

cfv -C -t md5 -f“当前目录.md5sums”

为每个子目录创建一个单独的校验和文件:

cfv -C -r

创建包含所有子目录中文件的“超级”校验和文件:

cfv -C -rr

4

我使用了hashdeep,如以下askubuntu答案中所述: 检查复制文件的正确性

要计算校验和:

 $ cd <directory1>
 $ hashdeep -rlc md5 . > ~/hashOutput.txt

要验证并列出差异:

 $ cd <directory2>
 $ hashdeep -ravvl -k ~/hashOutput.txt .
 hashdeep: Audit passed
    Input files examined: 0
   Known files expecting: 0
           Files matched: 13770
 Files partially matched: 0
             Files moved: 0
         New files found: 0
   Known files not found: 0

与md5deep相比,它具有一个优势,因为它将显示重命名(移动),添加和删除的文件,并且避免了http://www.meridiandiscovery.com/how-底部指出的长度为0的文件的问题。到/使用md5deep验证复制结果


3

这对我有用:(在您感兴趣的目录中运行)

md5deep -rl . | awk '{print $1}' | sort -n | md5sum

1

您可以为每个文件创建MD5和,按字母顺序排列这些校验和并具有它们(带或不带换行符)。由于MD5是加密的,因此它在使用哈希值时应该可以正常工作。

事物应该有一定的顺序,否则相等的dirs您将获得不同的结果。

你应该考虑的是增加了一些文件,以一个目录将彻底改变的结果,即使它只是一个.directory.DS_Store文件。


从技术上讲,对于不同的目录可以获得相同的哈希值。如果目录A具有2个内容为'ab'和'c'的文件,目录B具有2个内容为'a'和'bc'的文件,则即使仅对文件中的数据进行哈希处理,即使它们具有不同的内容。我什至不确定如何定义目录的MD5Sum。
Kibbee

1

作为一个特定的例子,假设您要将一些文件从directory1复制到directory2,然后要使用md5比较来验证成功的复制。

第一。cd到directory1并键入:

find -type f -exec md5sum "{}" \; > ~/Desktop/md5sum.txt

这将为目录1中的每个文件创建一个包含md5总和的参考文件。完成此操作后,只需将cd转到directory2并键入:

md5sum -c ~/Desktop/md5sum.txt

程序md5sum从md5sum.txt文件中获取每个路径,计算该文件在目标文件夹中的md5sum,然后将其与文件中存储的总和进行比较。

该过程完成后,您将获得一个摘要,例如“如此多的文件不匹配”或类似的内容。



1

我需要验证包含大量文件的备份/镜像的完整性,并最终编写了一个名为MassHash的命令行程序。它是用Python编写的。还提供了GTK +启动器。您可能要检查一下...

http://code.google.com/p/masshash/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.