2018/04/19更新

[サーバー] ファイル数が多すぎて、ディレクトリを削除できない時の対処

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
1つのフォルダに100万個以上のファイルがあるなど、多数のファイルがあると簡単にはディレクトリが消せません。そんな時に削除する方法をブログに書きたいと思います。



目次




どんな問題か

Wordpressの「WP File Cache」というキャッシュに関するプラグインを使っていて問題が起きました。そのプラグインが生成するキャッシュファイル数が多すぎて、サクラのレンタルサーバーのファイル数上限に引っかかり、その影響でメール受信ができなくなる(=メール受信時にファイルを作成できない)という問題です。

Wordpress上からそのプラグインを削除しようとしても、キャッシュファイル数が多すぎて削除できませんでした(正確に言うと削除処理でrmコマンドは動くのですが、サクラのレンタルサーバーの制約上、連続したプログラム実行は1時間程度でKillされます。1時間でrmが終わらないので削除できないという問題になりました)。

一気にディレクトリごとは削除できないので、キャッシュファイルを少しずつ削除することにしました。その時に使ったコマンドを、ブログに書いておきたいと思います。



ファイル数を確認する

ディレクトリ内にあるファイルの数を確認するには、以下のコマンドを実行します。
$ ls -lf [パス] | wc -l
1054394

# ls -lf   : 対象パス内のファイル一覧を表示
#        「-l」で1ファイルを1行で表示
#        「-f」でソートせずに表示
#
# wc -l    : 出力された行数をカウント
#        「-l」で行数のみを表示
何個か怪しいディレクトリをチェックしたところ、100万ファイルほどあるフォルダが2つあることがわかりました。



ファイルを少しずつ削除する方法

findコマンドと、そのコマンドのオプションで-deleteオプションを利用します。
$ find [ワードプレスのインストールディレクトリ]/wp-content/plugins/wp-file-cache/cache/terms \
  -exec sleep 0.1 \; \
  -delete -print

# find [パス]           : 対象のパス以下にあるファイルを取得する
# -exec sleep 0.1 \;   : 1ファイルごとに、0.1秒スリープ
# -delete              : ファイルを削除する
# -print               : 処理対象のファイルパスを出力する
ここでは1ファイルごとに0.1秒スリープすることで、サーバーに負荷をかけないようにしています。また-printオプションを付与することで、現在削除しているファイルがわかるようにしています。



つぶやき

上のコマンドでちょっとずつ削除できるのですが、上記のコマンドも1時間ほどするとKillされてしまいます(サクラのレンタルサーバーの制約より)。そのため、cronで1時間ごとに起動するようにしてちょっとずつ削除しました。3日ほどで全てのキャッシュファイルを削除する事ができました。



参考資料

下記のページが非常に参考になりました。今回の大量ファイル以外にも、大きなサイズのファイル削除など、いくつか他にも役立つ事例が掲載されています。

大量・巨大なファイル操作を低負荷で行う方法 - How old are you?



最後に

今回は急遽相談を頂いたのですが、エンジニアをしているといろいろな問題に取り組めるので、楽しいですね。今回の件で、Wordpressのキャッシュ系のプラグインは要注意ということがわかりました(笑)。

最後になりますが本ブログでは、サーバー、フロントエンド、Swift、PHP、Node.js、Python、Java、Linux、インフラ、Go言語、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

[NodeJS] nodeで例外処理を書いて、最低限落ちないサーバー実装を行うException Handler
[NodeJS] requestモジュールを使って、サーバーから画像ファイルをダウンロードする
[サーバー] さくらVPSのセットアップ① 〜 OSの確認、ユーザー作成、Git、Ruby導入 〜
[サーバー] さくらVPSのセットアップ② 〜 nginxのインストール、Jenkinsのインストール、nginxとJenkinsの接続(リバースプロキシ)、nginxとPHP、パケットフィルタリング、など 〜
[サーバー] AmazonLinuxにMySQL5.7をインストールする
[サーバー] MySQL5.7でrootのパスワードを忘れた場合のリセット方法(CentOSやAmazonLinuxの場合)
[Go] net/httpパッケージでWebサーバー(handlerの書き方、静的ファイル配信、Basic認証、など)
RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。