3

シェルスクリプトを実行して結果を1つのファイルに追加したいファイルが100万近くあります。

たとえばwc、ファイルに対して実行したいだけだとします。高速に実行されるように、と並列化できxargsます。しかし、出力を書き込むときにスクリプトが互いにステップオーバーすることは望ましくありません。おそらく、1つではなく、いくつかの別々のファイルに書き込んでから、cat後でそれらを書き込む方がよいでしょう。しかし、私はそれでも、そのような一時的な出力ファイルの数を入力ファイルの数よりも大幅に少なくしたいと思っています。私が望む種類のロックを取得する方法はありますか、それともデフォルトで常に保証されている場合ですか?

2つのファイルを再帰的catに並行して実行するユーティリティはありますか?

それを行うためのスクリプトを書くことはできますが、一時的なものに対処してクリーンアップする必要があります。それで、それをするユーティリティがあるかどうか疑問に思いました。

4

1 に答える 1

4

GNU Parallelは、次のように主張しています。

コマンドからの出力が、コマンドを順番に実行した場合に得られる出力と同じであることを確認します

その場合は、出力をファイルに単純にパイプしてparallel、中間データを処理させるのが安全だと思います。

-kオプションを使用して、出力の順序を維持します。

更新:(非Perlソリューション)

別の代替手段はprllで、これはいくつかのC拡張機能を備えたシェル関数で実装されます。これは、基本的なユースケースに比べて機能が豊富ではありGNU parallelませんが、仕事をする必要があります。

機能リストの主張:

個別のジョブからの出力のマングリング/インターリーブを防ぐために、内部バッファリングとロックを実行します。

したがって、出力の順序が重要でない限り、ニーズを満たす必要があります

ただし、このページの次のステートメントに注意してください。

prllは、STDERRに関する多くのステータス情報を生成するため、ジョブのSTDERR出力を別のプログラムの入力として直接使用することは困難です。


免責事項:私はどちらのツールも試しておらず、それぞれのドキュメントから引用しているだけです。

于 2011-03-10T10:11:02.113 に答える