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


15

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)を使用しています。


私はこの問題をグーグルで調べましたが、rsyncを「多くのファイルを削除する」ツールとして非常に効率的に使用できることを発見した人もいるようです。それが本当に速いかどうかは、評価するのはあなた次第です。
ヨハン

2
価値のあること:多くのフォルダー/ファイルを削除するときのパフォーマンスは、ファイルシステムに大きく依存しています。私の経験では、ext3(低速)とXFS(高速)で何百万もの小さなファイルを削除するときの違いは数時間になることがあります。
pdo

このようなケースが頻繁にあり、btrfsなどのファイルシステムを使用してサブボリュームを使用して事前に計画できる場合は、そのサブボリュームをダンプするだけで高速化できます。
PlasmaHH

ここで答えを見つけることができます。perlが最速です。 unix.stackexchange.com/questions/37329/...
SDsolar

回答:


17

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

find directory -delete

この場合:

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

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


+1; ただし、これは親ディレクトリも削除するため、OPはフォルダ自体ではなく、ごみ箱フォルダの内容のみを削除したいと思うと思います
-don_crissti

1
@don_crissti:良い発言。OPが〜/ .local / share / Trashの下のサブディレクトリのみを削除したい場合(1レベルのファイルではなく)、:(find ~/.local/share/Trash/*/ -delete もちろん、これはそれらのTrash / * /のファイル(およびdirs)も削除しますサブディレクトリも)
オリビエデュラック

2
+1の奇妙な動作を説明するためにtime
マーティントーマ

3
あるfind directory -delete本当に速くよりもrm -rf directory?結局のところ、彼らは同じ仕事をします、そして、それをする2つの方法がありません。
ジル「SO-悪であるのをやめる」

1
@Johan findは本当に速いです。その理由を知る機会を得たことがありますか?
過酷な

20

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

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

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


すごい。これを常に行うためのユースケースは何ですか?あなたがそれをたくさんやるなら、バックログし、複数の「directory.gone」を取得して失敗する危険はありませんか?私はあなたが「$$」または「%(日付...)」などの接尾辞を使用推測
SMCI

1
必要な場合は、おそらく同じファイルシステムにとどまることを保証する引数とともにmktempを使用できます。しかし、私は今、特定の例を持っているとは言えません。
小次郎

kojiroええ、ありがとう、mktemp私が思い出そうとしていたことです
...-smci

1

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

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

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

SolarisのUFSおよびZFSは、この種のタスクでは非常に高速であることが知られています。両方のファイルシステム実装には、関連オブジェクトの合計時間が長くなる場合でも、unlink()およびrmdir()呼び出しを高速で返す遅延バックグラウンド削除コードが含まれているためです。

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


それを考えることは許されるかもしれませんが、この答えが説明するように、これは実際には真実ではありません。
Hitechcomputergeek 16

0

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

(i)呼び出しと終了の間の経過したリアルタイム、(ii)ユーザーCPU時間(によって返されるaの値tms_utimeとの合計)、および(iii)システムCPU時間(aの値との合計)によって返されます。」tms_cutimestruct tmstimes(2)tms_stimetms_cstimestruct tmstimes(2)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.