モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

findで特定ディレクトリ以下のみを検索

なにかで障害が起きて、メールスプールから障害時点以降のファイルだけを抽出したい、みたいなことって時々あると思うんです。てかよくありますよね!


そういう時は普通、findを使って抽出すると思いますが、Maildir形式で保存している場合、例えば

/var/mail/exampleuser/Maildir/dovecot.index
/var/mail/exampleuser/Maildir/maildirsize
/var/mail/exampleuser/Maildir/new/...
/var/mail/exampleuser/Maildir/cur/...
/var/mail/exampleuser/Maildir/tmp/...

のようなファイルとディレクトリ構成になっているとき、これを単純に

find /var/mail -mtime -5 -type f

とすると、検索したい対象は「Maildir/new/」と「Maildir/cur/」以下だけなのに、dovecot.indexとか、それ以外な不要なファイルが引っかかってくる可能性があります。

なので、検索するディレクトリを「Maildir/new/」と「Maildir/cur/」に絞りたいなと思いましたが、うまいことやる方法が思いつきませんでした。

というようなことをtweetすると、ふみやすさん @satoh_fumiyasuから -path オプションを使う方法を教えてもらいました。


find /var/mail \( -path '*/Maildir/new/*' -o -path '*/Maildir/cur/*' \) -mtime -5 -type f


findの使い方が解説してあるページでも「-path」オプションについて記述してるところ少なくて、とりあえずgnu findtuilsのmanページ

https://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html


自分はこのtweet間に合わなくて、結局一旦textに吐いてからgrepで除去してやりました。
メールスプールに対してfind掛けるような行為はとにかくファイル数が多くて、すげえ時間がかかって泣けますね…