Linux md5/sha1散列大文件

Linux md5/sha1散列大文件,linux,bash,hash,Linux,Bash,Hash,我有超过120万个文件要在多个文件夹中散列 md5/crc哈希运算花费的时间太长一些文件的大小为1GB~11Gb 我想用head对文件的一部分进行散列 因此,当涉及到散列查找和散列所有内容时,下面的方法是有效的 find . -type f -exec sha1sum {} \; 我只是想知道如何更进一步,只需对文件的第一部分(比如256kB)进行哈希运算 find . -type f -exec head -c 256kB | sha1sum 不确定在这种情况下是否可以使用head,dd

我有超过120万个文件要在多个文件夹中散列 md5/crc哈希运算花费的时间太长一些文件的大小为1GB~11Gb 我想用head对文件的一部分进行散列

因此,当涉及到散列查找和散列所有内容时,下面的方法是有效的

find . -type f -exec sha1sum {} \;
我只是想知道如何更进一步,只需对文件的第一部分(比如256kB)进行哈希运算

find . -type f -exec head -c 256kB | sha1sum 
不确定在这种情况下是否可以使用head,dd会更好吗? 上面的命令不起作用,所以我想了解一下如何做到这一点

我希望输出与本地md5sum中看到的相同,例如以下格式(转到文本文件)



我不确定是否可以用一条线实现上述功能,或者是否需要使用for/do循环。。。。。性能是在RHEL6上使用bash的关键

不清楚您的限制在哪里。你的磁盘速度慢还是CPU速度慢

如果您的磁盘没有限制,那么您可能会因为使用单个内核而受到限制。GNU Parallel可以帮助实现这一点:

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
)。

这是导致进程中断的管道。把你的
头放进去脚本中的sha1sum
。还将“$@”作为参数添加到标头。祝你好运。这不是部分废除了散列的使用吗?也就是说,如果有几个字节改变-不管它们的位置-散列的变化?考虑使用<代码> GNU并行< /代码>得到的工作,使用所有这些可爱的核心,你所支付的闲置。这很简单,只需发送一个您可能会遇到的
parallel
yes的命令列表,磁盘i/o是一个问题。在我的情况下,大多数文件都是在慢备份存储上存档的。特别是当需要一个完整的散列时,从中读取是非常慢的。例如,一个2.5TB的文件夹需要6.5天才能完全散列每个文件(>600K个文件),因此需要一个解决方案,该解决方案将在复制后“某种程度上”确保文件处于有序状态。我已经看到后端存储的寻道时间非常慢,但读取速度非常快(想想磁带站机器人和类似设备)。取决于它是否在寻找,并行化可能会更快。唯一确定的方法就是尝试。我现在才明白,你需要一份复印件的信心。为此,我强烈建议使用
tail
而不是
head
:这样,如果只复制了一个大文件的开头,您就会捕捉到。这里的“perl-pe”到底在做什么?它似乎只在适当的位置工作,它将sha256sum的输出中的-1(即文件名)替换为-1
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