ShellScript
Bash
shell
find
ワンライナー

最終変更日時がある日付以前のディレクトリを一括で削除するワンライナー

More than 1 year has passed since last update.

はじめに

とあるディレクトリ内のサブディレクトリの最終変更日時を基に、ある期間中身に変更がないサブディレクトリだけを中身ごと削除するワンライナー。

記述例

例えば、煩雑になるのを防ぐためにログディレクトリ(ここでは /xxx/yyy/logdir とする)の直下に、日付ごとにサブディレクトリ(/xxx/yyy/logdir/yyyyMMdd という風に )を切って、その日のログとか色々格納しているディレクトリがあるとします。
ただ、そのままにしておくとどんどんとディスク容量を食っていくので、2週間経ったらそのディレクトリをファイルごと削除したい場合なんかは以下のように書く。

rm.sh
/usr/bin/find /xxx/yyy/logdir -maxdepth 1 -type d -mtime +14 | /usr/bin/xargs /bin/rm -rf

typeオプションの値をd、maxdepthオプションの値を1に、それぞれ指定しておくことで、カレントディレクトリ直下のサブディレクトリのみをfindの対象とします。

こないだ投稿した クラスタ構成下で共有ディレクトリ上のログファイルをローテートする 記事ではexecコマンドを使ってfindコマンドの結果を渡してrmしていましたが、xargsを使った方が早いようですので、今回はそっちで書いてます。
(findのdeleteオプションが使えるならそれが一番簡潔に書けそうですが)

おわりに

mtimeをキーにすると、touchコマンドとかでディレクトリの変更日付を変えることが出来ちゃうので、100%期待した通りの動作になるとは限らないのですが、デイリーとかウイークリーで定常的に作成されるファイルに対してはまずこの手で行けるのではないかと思います。