ディレクトリをバックグラウンドで順番に削除するか同時に削除するか

ディレクトリをバックグラウンドで順番に削除するか同時に削除するか

私が作成しているスクリプトの一部は、rm -rf2 つのディレクトリを完全に削除するために利用されます。

これらのディレクトリは比較的大きいため、削除にかなりの時間がかかる場合があります。

現在、ディレクトリは順番に削除されます:

rm -rf dir1
rm -rf dir2

以下の方法でバックグラウンドで同時に削除すると、もっと速くなりますか?

rm -rf dir1 &
rm -rf dir2 &
wait

もしそうなら、なぜですか?

答え1

場合によります。

削除されるファイルが同じファイル システムとハードウェア デバイス内にある場合、オペレーティング システムは物理リソースがハードウェア内で実際の操作を実行するのを待つため、いずれにしてもそれらは最終的に連続したものになります。 の各インスタンスはrm操作をキューに入れるため、一方が終了したらもう一方が使用可能になりますが、これによって大きな改善は期待できません。

rm2 つの異なる FS/ハードウェア デバイスにあるファイルで発生した場合、実質的に並列かつ非同期になるため、速度は 2 倍になります。

答え2

alx741 さんが言ったように、別々のファイル システム上にない限り、どちらにしても実質的なメリットは得られないと思います。700 MB のファイルでテストしてみました。これが私の考えを裏付けるテストです。複数のローカル パーティションを操作できないので、テストできません。

ここでは、1 つのコマンドとして順番に実行します。

time rm -f test.dat1 test.dat2
real    0m0.297s
user    0m0.000s
sys     0m0.295s

同時にここに

time rm -f test.dat1 &
time rm -f test.dat2 &
real    0m0.145s
user    0m0.000s
sys     0m0.144s

real    0m0.150s
user    0m0.000s
sys     0m0.150s

ここで、これらは 2 つの個別のコマンドとして再び順番に実行されます。

time rm -f test.dat1
time rm -f test.dat2
real    0m0.146s
user    0m0.000s
sys     0m0.146s

real    0m0.153s
user    0m0.000s
sys     0m0.152s

答え3

理論的には同時実行(並行実行)は可能かもしれない。もっとゆっくりオペレーティング システムが各ディレクトリをクラスター化したままにしておくことが考えられます。つまり、 の内容はdir1互いに近い inode 番号を持ち、互いに近いデータ ブロックを使用している可能性があります。 についても同じことが当てはまりますdir2。ただし、 の内容はdir1の内容に近くない可能性がありますdir2。(これは、オペレーティング システムのバージョン、ファイル システムの種類、およびディレクトリの作成履歴によって異なります。) この場合 (2 つのディレクトリが近くにない場合)、およびファイル システムが I/O ヘッドを物理的にシークする必要があるディスク (HDD) 上にある場合、同時実行では順次実行よりも多くのシーク (→ スラッシング) が必要になる可能性があります。

関連情報