重複の可能性あり:
数百万のファイルがあるディレクトリでrmを実行する
こんにちは、
だから私はこのディレクトリに行き詰まっています:
drwxrwxrwx 2 dan users 980M 2010-12-22 18:38 sessions2
ディレクトリの内容は小さく、数百万個の小さなファイルだけです。
ファイルシステムから消去したいのですが、できません。最初に試したのは次の方法です。
find sessions2 -type f -delete
そして
find sessions2 -type f -print0 | xargs -0 rm -f
しかし、どちらもメモリ使用量の増加を引き起こしたため、停止する必要がありました。ある時点では、システム メモリの 65% を使用していました。
そこで私は、システムで dir_index が有効になっていることが原因だと思いました (間違いなく間違っていました)。おそらく find はインデックス全体をメモリに読み込もうとしていたのでしょうか?
そこで私は(愚かにも)これをやりました:tune2fs -O^dir_index /dev/xxx
はい、これで完了です。find
上記のコマンドをもう一度実行すると...結果は同じです。メモリ使用量が異常に多いです。
急いでtune2fs -Odir_index /dev/xxx
dir_index を再度有効にし、Server Fault に駆け込みました。
2つの質問:
1) ライブ システムからこのディレクトリを削除するにはどうすればよいでしょうか。メモリと CPU の使用量が少なくて済むのであれば、どれだけ時間がかかってもかまいません。ちなみに、 を使用するとnice find ...
CPU 使用量を削減できたので、現時点での問題はメモリ使用量だけです。
2) dir_index を約 20 分間無効にしました。その間に新しいファイルがファイルシステムに書き込まれたことは間違いありません。dir_index を再度有効にしました。これは、dir_index を再度有効にする前に書き込まれたファイルのファイル名が古いインデックスから失われるため、システムがそれらのファイルを見つけられないことを意味しますか? そうで、これらの新しいファイルが重要でないことがわかっている場合、古いインデックスを維持できますか? そうでない場合、インデックスを再構築するにはどうすればよいですか? ライブ システムで実行できますか?
ありがとう!
答え1
この質問を参照してください:数百万のファイルがあるディレクトリでrmを実行する
これは私の答えですが、他にも素晴らしい答えがありました。
このファイル システムの他のすべてのファイルを一時的な保存場所にバックアップし、パーティションを再フォーマットしてから、ファイルを復元することは可能でしょうか?
答え2
現在のディレクトリを移動し、新しいディレクトリを作成してから、古いディレクトリを削除することをお勧めします。
mv dirname dirname.old; mkdir dirname ls -ld dirname dirname.old # 権限が正しいことを確認します rm -rf dirname.old
これには、誤って再実行してしまう可能性のある「rm -rf dirname」が履歴に残らないという追加の利点があります。 :-)
「rm -rf」は、ごくわずかなメモリ オーバーヘッドのみを使用してディレクトリを削除します。ただし、以前に実行した「find」コマンドも、大量のメモリ オーバーヘッドを使用していないはずです。メモリ使用量をどのように測定していますか?
このメモリ使用量を、「free」コマンドの出力の「free」列を見て測定しているのではないですか? Linux は未使用のメモリをディスク キャッシュに使用しますが、「free」の下の一番上の列はそれを考慮していません。 いずれかのプログラムのメモリ使用量を確認していますか? どのプログラムですか? 「ps awwlx --sort=vsz」を実行すると、メモリ使用量の多いプログラムが、大きいものを最後にしてソートされて表示されます...
答え3
問題は、xargsにパイプしていることです。おそらくそこですべてのメモリを消費しています。findには削除オプションがあります。
find sessions2 -type f -delete
答え4
うーん、クレイジーなアイデアですね。うまくいくかどうかはわかりません。バッチでやってみたらどうでしょうか? まず、ディレクトリの名前を変更して、新しい空のディレクトリを作成します。そうすれば、新しいファイルが邪魔になりません。次に、ディレクトリの内容をテキスト ファイルに出力します。次に、そのファイルを調べて、100 個のファイルを一度に削除し、その間にスリープ状態と同期を行います。