findのemptyとdeleteが便利

4年前に「findのexecが便利」なんて事を書きましたが・・・。
http://d.hatena.ne.jp/yumatsumo/20070516

成長したのかしてないのかまた感涙もののfindのオプションを発見しました。
今回はemptyとdeleteが便利!というお話です。


きっかけ

mod_disk_cacheのhtcachecleanがどうも粛清が緩くてinode溢れに悩んでいた訳です。

もう頼ってられない、自分でやろう!粛清じゃー!という訳で以下の2つのルールでやろうと思ってはまりました。
・更新日がCacheMaxExpireを超えたファイルは削除
・空のディレクトリは削除

で、更新日はmtimeでほげほげで良いんですが、rmdirで空ファイル削除しようと思ったんですが中身にファイルが残ってるとステータスがエラーとなってしまい健全性が確認できません。

$ find ./ -type d | xargs rmdir
rmdir: ./: Invalid argument
rmdir: ./test3: Directory not empty
$ echo $?
123

さてさてと悩んでいるとemptyとdeleteという素晴らしいオプションがmanに書いてありました。


このように便利です

↓が検証用のファイル・ディレクトリ構成です。(test1,2は空ディレクトリtest3配下にはファイルが有ります。)

$ mkdir test1 test2 test3; echo "foo" > test3/foo
$ tree
.
|-- test1
|-- test2
`-- test3
    `-- foo

3 directories, 1 file

emptyオプションエイヤ!で空ディレクトリが引っかかりました。

$ find ./test* -type d -empty
./test1
./test2

そしてdeleteオプションをつけると空ディレクトリが削除されました!!おっけーい。

$ find ./test* -type d -empty -delete
$ tree
.
`-- test3
    `-- foo

1 directory, 1 file

rmdirと似たような動作で中にファイルが有る場合は削除されませんでした。(メッセージも同じです。)

$ find ./test* -type d -delete
find: cannot delete ./test3: Directory not empty
$ rmdir test3
rmdir: test3: Directory not empty


ちなみにちなみに

ファイル指定の場合は空ファイルだけが引っかかりました。ファイル指定時のdeleteオプションはファイルサイズに関わらず↓の例だと全部削除されましたのご注意を!!

$ touch empty_file
$ echo "aaa" > aaa_file
$ find ./ -type f -empty
./empty_file

これで快適なrmdirライフを満喫できます!!