web-dev-qa-db-ja.com

findを使用して再帰的削除を並列化する

.inで終わるすべてのファイルを再帰的に削除したい。これには時間がかかり、多くのコアを利用できるので、このプロセスを並列化したいと思います。 このスレッド から、xargsまたはmakeを使用してfindを並列化できるようです。このfindのアプリケーションを並列化することは可能ですか?

これが私の現在のシリアルコマンドです:

find . -name "*.in" -type f -delete
1
kilojoules

-delete-print(デフォルト)に置き換えてGNU parallelにパイプすることで、ほとんどの場合、次のようになります。

find . -name '*.in' -type f | parallel rm --

これにより、コアごとに1つのジョブが実行されます。代わりに-j Nを使用して、N並列ジョブを使用します。

削除はおそらくCPUバウンドよりもI/Oが多いため、これが順番に削除するよりもはるかに高速に実行されることは完全には明らかではありませんが、テストすることは興味深いでしょう。

(2つのコマンドが完全に同等ではないため、「ほとんど実行する」と言いました。たとえば、入力パスの一部に改行文字が含まれている場合、parallelバージョンは正しく機能しません。)

3
dhag