LoginSignup
31
32

More than 5 years have passed since last update.

すさまじい量のファイルを消す方法

Last updated at Posted at 2015-02-03

結論から書くとls -f | head -n <int> | perl -lne unlink

どうしてこうなった

オプションを事故ったコマンドを実行して放置した結果、大量の中間ファイルを生成してしまう羽目に。

その数単位。

lsコマンドがうんともすんとも言わなくなったせいで、最初は何が起きているのかさっぱり分からなかった。どうやらデフォルトではlsrmはファイルをリストアップしようとするせいなのか、あまりに大量のファイルを扱おうとするとメモリを食いつぶしてしまうようだ。findとか色々試してみたけど標準出力に帰ってきたものは誰一人としていなかった。

幸い、ファイル名が規則的だったので必要なファイルは隔離できた。ディレクトリごと削除できればいいのに。。。

解決方法

まずls-fオプションをつける。
デフォルトでは表示を整形するためにlsコマンドはファイルをソートしたりしているのだが、このオプションを付ければディスク上にある順で逐次ファイル名を出力してくれる。
これをheadでも使って適当な数ずつ処理する。

削除はrmでもいいのだが、何やらperlunlinkを使うと速いらしい1

というわけで適当にスクリプトを書くとこうなる。

remove.sh
count=0
while [ $count -lt 100 ]; do
    ls -f ./directory | head -n 1000 | perl -lne unlink
    count=`expr ${count} + 1`
    sleep 5
done

ファイル数に合わせてループ回数を、負荷がかかり過ぎないよう一度に消す数とお休みする時間の長さを適当に設定。今回の場合はファイルの総数を知れたのが不幸中の幸い2

もっともファイル数が分かった所で相応の時間がかかるのは変わらないので、どの道、そんな大量のファイルを消そうとするとスクリプトを走らせて放置することになる。


  1. Which is the fastest method to delete files in Linux 

  2. ある名前を持つファイルが存在するかどうかは確認できるので、ファイル名が規則的に付いているなら二分探索か何かでどうにかできる。 

31
32
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
32