Bash:在许多文件上并行化md5sum校验和

use*_*963 21 bash

比方说,我有一个64核服务器,我需要计算md5sum所有文件/mnt/data,并将结果存储在一个文本文件中:

find /mnt/data -type f -exec md5sum {} \; > md5.txt
Run Code Online (Sandbox Code Playgroud)

上述命令的问题是,在任何给定时间只运行一个进程.我想利用我的64核的全部功能.理想情况下,我想确保在任何给定时间,64个并行md5进程正在运行(但不超过64个).

也.我需要将所有进程的输出存储到一个文件中.

注意:我不是在寻找一种md5sum并行计算一个文件的方法.我正在寻找一种方法来并行计算64个不同文件的64 md5sums,只要有来自的文件find.

Ste*_*eve 23

使用GNU parallel.您可以在此处找到有关如何实现它的更多示例.

find /mnt/data -type f | parallel -j 64 md5sum > md5.txt
Run Code Online (Sandbox Code Playgroud)


Ton*_*ony 8

您也可以使用xargs,它可能比某些发行版上的并行更多.

-P控制生成的进程数.

find /mnt/data -type f | xargs -L1 -P24  md5sum > /tmp/result.txt
Run Code Online (Sandbox Code Playgroud)

  • 当文件名包含空格时,提供的答案似乎不起作用。正确的是以下一个,也使用 POSIX 开关:“ find /mnt/data -type f -print0 | xargs -L1 -P24 -0 md5 > /tmp/result.txt ”您可能还想使用选项 - r for md5 反转输出并在路径之前获取校验和,以便您可以按校验和排序并轻松找到重复项。 (2认同)
  • 现在,这个答案得到了极大的关注:让我们从另一个已删除的答案中恢复评论:“这将失败!同时从多个流写入一个文件会生成损坏的文件(!)。请不要使用它。我有确切的问题就我而言。– ******** 2014年3月21日6:49“ (2认同)

jm6*_*666 7

如果你想试验,试试安装md5deep.(http://md5deep.sourceforge.net)

以下是您可以阅读的手册:

-jnn控制多线程.默认情况下,程序将创建一个生产者线程来扫描文件系统,每个CPU核心创建一个散列线程.多线程导致输出文件名以非确定性顺序排列,因为散列时间较长的文件将被延迟.如果需要确定性顺序,请指定-j0以禁用多线程

如果这没有帮助,那么您就有I/O瓶颈.