パイプの出力をコピーできますか?

パイプの出力をコピーできますか?

作業は簡単です。私のスクリプトの一部は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

おすすめ記事