特定の日付より古いファイルを削除する方法
例えば一年以上前の3/3より前(3/2以前)のログファイルを削除したい場合。
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
は指定した日を含む「以降」であり、
その否定なので「以前」ではなく「前」になることに注意(当日は含まない)。
あとはこの抽出したファイルにxargsを使って適当なコマンドをあてれば良い。 今回の場合は削除のrmコマンドを使った。
ついでに日数指定の復習
timeの意味
atime:アクセス日(access) ctime:ステータス変更日(chenge) mtime:ファイルを修正した日(modify)。普通はこれを使用する。
日数の指定
-mtime 4: ちょうど4日前 -mtime +4: 5日以前 -mtime -4: 3日以内