ざる魂

真似ぶ魂、学ぶの本質。知られざる我が魂

特定の日付より古いファイルを削除する方法

例えば一年以上前の3/3より前(3/2以前)のログファイルを削除したい場合。

/img/find-del/find1.png

findがすぐに思いつくが、findには日付指定のオプションが見あたらない。

答え

touchでダミーファイルを作って、findのnewerオプションと否定演算子を使い、xargsとrmで削除する。

$ touch -t 201303030000 /tmp/hoge
$ find /usr/local/apache/logs \! -newer /tmp/hoge|sort|less

中身を確認して問題なさそうなら

$ find /usr/local/apache/logs \! -newer /tmp/hoge|xargs rm

解説

普通に考えると find を使って -mtime などで日数を指定する。

$ find /usr/local/apache/logs -mtime +180|wc -l
554
$ find /usr/local/apache/logs -mtime +90|wc -l
757

でも今回の要件の場合日数を計算するのが面倒なので日付を直接指定して削除したい。 しかし man find してもそんなオプションはない。 だが良くみるとファイルのタイムスタンプを基準にするオプション newer ならある。 このオプションを使えばなんとかなりそうである。

まず下記のようにダミーのファイルを作成する。

$ touch -t 201303030000 /tmp/hoge

tオプションの意味は YYYYMMDDhhmm 。詳細は man touch 参照。

で、このファイルのタイムスタンプを基準に newer を使えばよい。

$ find /usr/local/apache/logs -newer hoge|sort|less

これで2013年3月3日以降に変更されたファイルを抽出できる。 だが今回の場合は「指定日以前」のファイルを抽出したいのでこれでは駄目だ。

newer があるなら older オプションがありそうだが残念ながらなかった。 ではどうすればいいんだと小一時間考えた結果、否定オプション ! を使えば良いことがわかった。

$ find /usr/local/apache/logs \! -newer hoge|sort|less

否定オプションにはエスケープが必要である。 newer は指定した日を含む「以降」であり、 その否定なので「以前」ではなく「前」になることに注意(当日は含まない)。

/img/find-del/find2.png

あとはこの抽出したファイルにxargsを使って適当なコマンドをあてれば良い。 今回の場合は削除のrmコマンドを使った。

ついでに日数指定の復習

timeの意味

atime:アクセス日(access)
ctime:ステータス変更日(chenge)
mtime:ファイルを修正した日(modify)。普通はこれを使用する。

日数の指定

/img/find-del/find3.png
-mtime 4: ちょうど4日前
-mtime +4: 5日以前
-mtime -4: 3日以内