これに基づいて: 同時に複数のダイジェストを計算します(md5、sha256)?
SHA256ハッシュを計算したい多数のファイルを含むフォルダーがあります。
私はセグメントをコード化するために使用しました:
#!/bin/bash
for file in *; do
sha256sum "$file" > "$file".sha &
done
現在、私のコンピューターに16個の物理コアしかないことを除いて、sha256ハッシュを並列で計算しています。
したがって、私が持っている質問は、GNUこれを実行するために並列を使用する方法ですが、システムで利用可能な16の物理コアを使用して実行し、ハッシュが完了すると実行することです。 、ハッシュする次のファイルを自動的に取得しますか?
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
と同等の場合、xargs
をparallel
に置き換えます。
zsh
シェルでは、次のように実行できます
autoload -U zargs
setopt EXTENDED_GLOB
zargs -P 16 -L 1 -- (^(*.sha)) -- sh -c 'sha256sum "$1" > "$1".sha' sh
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未満を並行して実行したい場合があります。