私のマシンには、apache、mysql、php を搭載した Debian Squeeze が稼働しています。ディレクトリの 1 つに、他のディレクトリと 500k を超える大量のファイルがあります。WinSCP で削除しようとしましたが、ハングします。24 時間以上経過しても、WinSCP は応答しません。現在、このディレクトリを Putty (rm -rf dirname) で削除しようとしていますが、WinSCP と同様に応答しなくなりました。何か提案はありますか? ありがとうございます!
私はそのマシンへのルートアクセス権を持っています。
答え1
ディレクトリを削除すると、機能するはずです。ファイルが多すぎるため、個々のファイルを削除しようとすると、問題が発生する可能性があります。実行していませんかrm -rf dirname/*
?
私の推測では、非アクティブ状態が原因で SSH 接続が失われていると思いますが、サーバー上でコマンドが正しく実行されなかったことは確かですか?
いずれにせよ、回避策としては、ノーフープ:
nohup rm -rf dirname
コマンドを起動してログオフしても、バックグラウンドで継続されます。
アップデート:
私は見つけたこの質問U&L.SE で、ぜひご覧になることをお勧めします。残念ながら、問題を再現できません。2516007 個のファイルを含むディレクトリを作成しましたが、次のようにして削除できましたrm -rf
。
$ mkdir ha
$ for X in $(seq 1 10000);do touch {1..10000}_$X; done
$ ls -f ha | wc -l
2516007 <= I stopped before the for loop finished, but this should be enough
$ time rm -rf ha/
real 23m11.695s
user 0m3.540s
sys 0m42.891s
つまり、約 200 万個の空のファイルを削除するのに 20 分かかりました。大量の空でないファイルを削除するのに数時間かかるのは当然のようです。
とにかく、U&L の質問からの提案のいくつかが役立つはずです。具体的には、次のとおりです。
find /delb -type f --delete
またはこちら(オリジナルから少し変更)
find /delb -type f -print0 | xargs -0r rm -f
最後に、一度にいくつかのファイルを削除するという方法もあります。ファイル名の一部が文字列「foo」で始まり、他のファイル名が「bar」などで始まることが分かっている場合は、次のようにします。
rm -rf /delb/foo*
rm -rf /delb/bar*
などなど。次のようなことも試すことができます。
for n in {a..z}; do rm -rf /delb/$n*; done
for n in {A..Z}; do rm -rf /delb/$n*; done
for n in {0..9}; do rm -rf /delb/$n*; done
この最後のコマンドは、アルファベットの各文字で始まるファイル名を順番に削除し、次に数字で始まるファイル名を削除します。
答え2
すでに投稿されている回答とは別に、i ノードが不足したファイル システムを扱った私の経験から。ファイル システムには 10 億を超えるファイルがあります。
ファイルを削除/一覧表示する最も速い方法は、特に何千ものファイル/ディレクトリがある場合に、find を使用することです。展開する必要がなければ、find はすぐに動作を開始します。
削除するパスを検索 -type f --delete
*
コマンドの一部として、 またはその他のタイプのコマンド ライン拡張を使用しないでください。*
は、rm / ls などのコマンドに渡される前にターミナルで実行されます。そのため、ターミナルは、作業を実行する実際のコマンドに渡す前に、10 万個のファイルすべてをリストしようとします。これは非常に遅くなります。
man bash
...
展開 コマンド
ラインは単語に分割された後、展開が実行されます。実行される展開には、中括弧展開、チルダ展開、パラメータと変数の展開、コマンド置換、算術展開、単語分割、パス名展開の 7 種類があります
。...