2015-03-02 150 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