作業は簡単です。私のスクリプトの一部はmd5とsha1ハッシュを計算する必要があります。入力はファイル(大きなファイル)で、後で出力の組み合わせのためにハッシュをMD変数とSH変数に入れる必要があります。
処理されるファイルは非常に大きいが(数百GB)、何度も読み書きするデータの種類を使用しようとしています。私はプロセス置換であることを発見し、次のように採用しました。
$ dd if=big.tgz 2>/dev/null |tee >(sha1sum ) > >(md5sum ) ;
変える:
$ SH=$(sha1sum big.tgz); MD=$(md5sum big.tgz);
しかし、私は以下を見つけました。
どちらもおおよその時間を必要とするため、リソースと時間を節約できません。 40秒(4.776GBファイルの場合)
>(md5sum )
後でスクリプトで使用するために子プロセスの結果を変数MDに保存する方法がわかりません。
私はPipelineexecを理解しようとしていますが、素敵でカラフルなイラストがあっても成功しませんでした。
VAR = $(command)に加えて、出力を変数にリダイレクトする他の方法はありますか?
ベストアンサー1
パフォーマンスの面では、CPUによって制限されることがあります。実際、MD5とsha1sumは40秒で4.7TBを送信して素早く感じられます。だからこうして仕事をしても。ディスクIOが少なくなることは言及する価値があります。
実際にはこれを行う必要はありませんdd
。後で使用するために、sha1sumとmd5sumの出力をファイルに直接書き込むこともできます。
tee < big.tgz >(sha1sum > big.tgz.sha1 ) > >(md5sum > big.tgz.md5 )
sha1=`cat big.tgz.sha1`
md5=`cat big.tgz.md5`
私が知っている1つの2つの変数を同時に異なる値に設定する方法がないので、このような一時ファイル(big.tgz.sha1
および)を使用することをお勧めします。big.tgz.md5
どちらも変数に直接キャプチャできますが、どちらもキャプチャすることはできません。同じ標準出力を許可してmd5sum
同時に記録すると、予測できない問題が発生する可能性があります。sha1sum