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ライフを満喫できます!!