web-dev-qa-db-ja.com

たくさんのサブフォルダーがあるフォルダーをすばやく削除するにはどうすればよいですか?

私は266778サブフォルダーを含むフォルダーを持っています。どうすれば削除できますか?

私が試してみました

cd ~/.local/share/Trash/
Sudo rm -rf *

時間がかかります。 1分25秒のリアルタイムと0.072秒のユーザー時間の後、2500個のフォルダーのみが削除されました。この方法では、このフォルダを削除するのに2時間以上かかります。

このフォルダを削除するより速い方法はありますか?ユーザーの時間とリアルタイムの間にこのような大きな違いがあるのはなぜですか?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Linux 2.6.32(Ubuntu 10.04.4 LTS)を使用しています。

15
Martin Thoma

「find」のバージョンが-deleteサブコマンドを実装している場合は、次を試すことができます

find directory -delete

この場合:

find ~/.local/share/Trash/ -delete

Rmなどの一部のコマンドは、ほとんどの作業をカーネルで実行します。正確には、ファイルシステムルーチン内。システムコールの実行に費やされた時間はそのように計算されるため、「rm」コマンドが長時間実行されても、ユーザーランドではあまり機能しません。システムコールはほとんどの機能を実行します。

17
Johan

fastの定義によって異なります。すでにここにある答えは、ファイルシステムからディレクトリを実際に削除するための良い解決策を提供しますが、本当に必要なのは、ディレクトリをできるだけ速く解放することですnameは、同じファイルシステムでの名前変更が瞬時に行われます。

{ mv directory directory.gone && rm -rf directory.gone; } &

実際には、実際の削除を高速化していないため、これは不正行為ですが、実際には非常に便利です。このトリックを常に使用するため、遅い削除操作を待つ必要がありません。

20
kojiro

ローカルのrm実装が壊れていない限り、もちろん_rm -rf directory_または_rm -rf *_が最速の方法です。

findを使用しても利点はありません。

これが速いか遅いかは、主にファイルシステムとOSの実装に依存します。したがって、質問は不適切なようです。

Solaris上のUFSおよびZFSは、この種のタスクで非常に高速であることが知られています。これは、両方のファイルシステム実装にunlink()およびrmdir()呼び出しが関連オブジェクトは合計でより時間がかかります。

カーネルでのバックグラウンド削除の遅延により、ディレクトリの更新も高速に実行でき、これにより操作全体の速度が向上します。

1
schily

これは部分的な答えにすぎず、コマンドが返す3つの値に光を当てています。 time(1) manpage から引用:

(i)呼び出しから終了までの経過実時間、(ii)ユーザーCPU時間(_tms_utime_の_tms_cutime_値と_struct tms_値の合計 times(2) )、および(iii)システムCPU時間(_tms_stime_の_tms_cstime_および_struct tms_値の合計 times(2) )。」

0
schaiba