2015-03-02 105 views
2

我有超过1/2百万个文件散列多个文件夹 md5/crc散列花费的时间太长一些文件的大小是1GB〜11GB 我想只是散列文件的一部分使用头md5/sha1散列大文件

所以下面的工作,当涉及到散列发现和哈希的一切。

​​

我只是知道如何进一步采取这样的步骤,只是做哈希的文件,例如

find . -type f -exec head -c 256kB | sha1sum 

不知道头部是好的,在会中这种情况下使用的第一发言权256KB dd会更好吗? 上面的命令不工作,所以寻找想法如何我可以做到这一点

我想输出是与在本地md5sum中看到的相同,例如在下面的格式(去文本文件)

<Hash> <file name> 

林不知道如果以上是可能的单线或会用于/ do循环需要使用.....性能使用bash上RHEL6

+1

其管道抛出你的过程。把你的头.. | sha1sum'在脚本中。还要添加一个“$ @”作为参数。祝你好运。 – shellter 2015-03-02 18:43:53

+2

这不是部分废除散列的使用吗?也就是说,如果几个字节发生变化 - 不管它们的位置如何 - 散列值会发生变化? – 2015-03-02 19:27:33

+1

考虑使用'GNU并行'来完成工作,使用所有您付费的可爱内核都处于闲置状态。这很简单,只需发送一个命令列表,你可以运行到'parallel' – 2015-03-02 19:29:54

回答

4

目前还不清楚是关键你的限制在哪里。你有慢速磁盘还是慢速CPU?

如果您的磁盘不是限制,那么您可能受限于使用单个内核。 GNU并行可与帮助:

find . -type f | parallel -X sha256sum 

如果限制是磁盘I/O,那么你的head想法非常有道理:

sha() { 
    tail -c 1M "$1" | sha256sum | perl -pe 'BEGIN{$a=shift} s/-/$a/' "$1"; 
} 
export -f sha 
find . -type f -print0 | parallel -0 -j10 --tag sha 

-j10的最佳值取决于你的磁盘系统上,所以请尝试调整它直到找到最佳值(可以低至-j1)。

+0

yes磁盘I/O对我来说是一个问题,大多数文件存档在慢备份存储上。从这里读取,特别是当需要完整散列时非常慢。作为一个例子,一个2.5TB的文件夹需要6.5天才能完全散列每个文件(> 600K文件)。因此,需要一个解决方案,它会给予“一些”信任文件是在副本之后的顺序 – AShah 2015-03-08 12:04:00

+1

我见过后端存储搜寻时间极其缓慢,但读取速度相当快(想想磁带站机器人和类似的)。根据它是否正在寻找,它可能仍然会更快地并行化。要知道的唯一方法就是尝试。 – 2015-03-08 20:06:26

+2

我现在才明白,你需要复制的信心。为此,我强烈建议使用'tail'而不是'head':这样,如果只复制一个大文件的开头,那么您将捕获这些文件。 – 2015-03-08 20:07:54