GNUを使用してsha256ハッシュ値を並列に計算する方法は?

GNUを使用してsha256ハッシュ値を並列に計算する方法は?

基準: 複数のダイジェスト(md5、sha256)を同時に計算しますか?

SHA256ハッシュを計算したいファイルがたくさんあるフォルダがあります。

私はセグメントをコーディングしようとしました:

#!/bin/bash
for file in *; do
sha256sum "$file" > "$file".sha &
done

現在、sha256ハッシュを並列に計算しています。ただし、マイコンピュータには物理コアが16個しかありません。

もしそうなら、私の質問は、GNUパラレルを使用してどのように実行できるかということです。ただし、システムで使用可能な16個の物理コアのみを使用し、ハッシュが完了すると自動的に次のファイルハッシュを選択しますか?

答え1

GNUを使用すると、parallelシェルループを完全に回避し、以下を実行できます。

parallel -P 16 sha256sum {} ">"{}.sha ::: *

これはsha256sum、globから返されたすべてのファイル(またはディレクトリ、しかしスクリプトが実行するアクション)で実行され、*出力をfileName.sha

$ ls
file1  file2  file3  file4  file5
$ parallel -P 16 sha256sum {} ">"{}.sha ::: *
$ ls
file1      file2      file3      file4      file5
file1.sha  file2.sha  file3.sha  file4.sha  file5.sha

しかし、@Kusalandandaを覚えておいてください。指摘この種のボトルネックの主な原因はI / Oであり、必ずしもCPUではありません。 16個未満を並列に実行することをお勧めします。

答え2

以下を使用します (および をサポートするxargsこのユーティリティが実装されていると仮定)。-0-P

printf '%s\0' * | xargs -0 -L 1 -P 16 sh -c 'sha256sum "$1" > "$1".sha' sh

これにより、現在のディレクトリのすべての名前がに渡されますxargs。ユーティリティは、これらの名前ごとにxargsインラインスクリプトを呼び出して、最大16の同時プロセスを開始します。shインラインスクリプトは引数を受け入れてsha256sum実行し、結果を同じ名前のファイルに出力します。

.shaこれは、同じパイプラインの以前の実行で生成されたファイルを選択することもできます。これを防ぐには、*扱っている特定の名前よりも複雑なglobを使用してください。たとえば、次のようになりますbash

shopt -s extglob
printf '%s\0' !(*.sha) | xargs ...as above...

さらに、sha256sum大容量ファイルを並列に実行することは、CPUバインディングではなくディスクバインディングである可能性があります。


GNUに該当する場合にparallel置き換えてください。xargsparallel


zshシェルではできます

autoload -U zargs
setopt EXTENDED_GLOB

zargs -P 16 -L 1 -- (^(*.sha)) -- sh -c 'sha256sum "$1" > "$1".sha' sh

関連情報