findについての覚え書き


一定数の新しいディレクトリを残して、古いものだけ削除する。例えばこんなときに、

$ ll -d upload_*
drwxr-xr-x 2 apache apache 4096  2月 15 20:21 upload_1266232894
drwxr-xr-x 2 apache apache 4096  2月 15 20:26 upload_1266233148
drwxr-xr-x 2 apache apache 4096  2月 15 20:29 upload_1266233372
drwxr-xr-x 2 apache apache 4096  2月 15 20:37 upload_1266233808
drwxr-xr-x 2 apache apache 4096  2月 15 20:40 upload_1266234035
drwxr-xr-x 2 apache apache 4096  2月 15 21:02 upload_1266235350
drwxr-xr-x 2 apache apache 4096  2月 15 21:05 upload_1266235518
drwxr-xr-x 2 apache apache 4096  2月 15 21:07 upload_1266235658
drwxr-xr-x 2 apache apache 4096  2月 15 21:14 upload_1266236074

新しい3個だけ残して後は全て削除するときはこうする。

$ find -maxdepth 1 -name 'upload_*' | sort | head -n -3 | xargs rm -fr

事前に削除するファイルを確認したいときは-printfオプション。

$ find -maxdepth 1 -name 'upload_*' -printf '%p ; %t\n' | sort | head -n -3
./upload_1266232894 ; Mon Feb 15 20:21:52 2010
./upload_1266233148 ; Mon Feb 15 20:26:06 2010
./upload_1266233372 ; Mon Feb 15 20:29:49 2010
./upload_1266233808 ; Mon Feb 15 20:37:10 2010
./upload_1266234035 ; Mon Feb 15 20:40:54 2010
./upload_1266235350 ; Mon Feb 15 21:02:49 2010

単純に一日(24時間)以上前のものを削除するだけなら、

$ find -maxdepth 1 -mtime +0 -name 'upload_*' -printf '%p ; %t\n' -exec rm -fr {} \;

  • -mtimeオプションの引数は実際の日数より一つ少ないものを指定する。
  • -execオプションはセミコロンで終わるが、バックスラッシュ(円マーク)でエスケープしないとシェルに検知されてしまう。
  • 日単位ではなく、分単位で指定するときは-mtimeオプションではなく、-mminオプションを使う。

コメントを残す