基準: 複数のダイジェスト(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
置き換えてください。xargs
parallel
zsh
シェルではできます
autoload -U zargs
setopt EXTENDED_GLOB
zargs -P 16 -L 1 -- (^(*.sha)) -- sh -c 'sha256sum "$1" > "$1".sha' sh