web-dev-qa-db-ja.com

GNU= parallelを使用してsha256ハッシュを計算するにはどうすればよいですか?

これに基づいて: 同時に複数のダイジェストを計算します(md5、sha256)?

SHA256ハッシュを計算したい多数のファイルを含むフォルダーがあります。

私はセグメントをコード化するために使用しました:

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

現在、私のコンピューターに16個の物理コアしかないことを除いて、sha256ハッシュを並列で計算しています。

したがって、私が持っている質問は、GNUこれを実行するために並列を使用する方法ですが、システムで利用可能な16の物理コアを使用して実行し、ハッシュが完了すると実行することです。 、ハッシュする次のファイルを自動的に取得しますか?

8
alpha754293

xargsを使用する(そして-0-Pをサポートするこのユーティリティの実装があると仮定します):

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

これにより、現在のディレクトリ内のすべての名前がヌル終了リストとしてxargsに渡されます。 xargsユーティリティは、これらの名前のそれぞれに対してインラインshスクリプトを呼び出し、最大で16の同時プロセスを開始します。インラインスクリプトは引数を取り、sha256sumを実行して結果を類似の名前のファイルに出力します。

これは、同じパイプラインの前回の実行で作成された.shaファイルも取得する可能性があることに注意してください。これを回避するには、*よりも少し洗練されたグロブを使用して、処理する特定の名前に一致させます。たとえば、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
8
Kusalananda

GNU parallelを使用すると、シェルループを完全に回避して次のように実行できます。

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

これは、グロブsha256sumから返された各ファイル(またはディレクトリですが、スクリプトが行ったもの)で*を実行し、出力を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未満を並行して実行したい場合があります。

6
terdon