応用例を下に例示します。
find / \! -name "*.c" -print
探索をルートディレクトリから開始し、ファイル名の終わりが「.c」でないものを表示します。
find / -newer ttt -user wnj -print
探索をルートディレクトリから開始し、ファイルが「ttt」というファイルより新しく、所有者が「wnj」であるようなものを表示します。
find / \! \( -newer ttt -user wnj \) -print
探索をルートディレクトリから開始し、「ttt」というファイルより古いか、所有者が「wnj」以外のファイルを表示します。
find / \( -newer ttt -or -user wnj \) -print
探索をルートディレクトリから開始し、ファイルが「ttt」というファイルより新しいか、所有者が「wnj」であるようなものを表示します。
2. ディレクトリ内のファイル数やディレクトリ数を調べる
「-type」オプション、「wc」コマンドを組み合わせることにより、ディレクトリ内のファイル数やディレクトリ数を調べることができます。
下記で、ファイル数を調べます。
find ディレクトリ名 -type f | wc -l
下記で、ディレクトリ数を調べます。
find ディレクトリ名 -type d | wc -l
3. xargs と組み合わせる
「xargs」と組み合わせることにより、検索したファイルに対して、さらに操作を行うことができます。
こういう場面は頻繁に現れますが、関数がどのヘッダに定義してあったかを調べるようなときは、以下のように「grep」と組み合わせます。
find ディレクトリ名 -name "*.h" | xargs grep キーワード
4. 特定のディレクトリを除外する
$ find Includes -type f
Includes/no-accf.conf
Includes/freebsd.conf
Includes/RCS/freebsd.conf,v
Includes/RCS/default.conf,v
Includes/RCS/showkit.conf,v
Includes/default.conf
Includes/showkit.conf
てな感じになるとき「RCS」配下を見たくないことがあります。
「.svn」なんかもこういうことがあるかと思います。
ディレクトリ指定の次に「-name '除外するもの' -prune -o」という除外オプションを付けます。
$ find find Includes -name 'RCS' -prune -o -type f
Includes/no-accf.conf
Includes/freebsd.conf
Includes/RCS/
Includes/default.conf
Includes/showkit.conf
あるいは、「-not -path」の後ろに除外するパス(必ずワイルドカードを含む)を指定することで、そのパスを検索から除外できます。
「.*」というファイルを検索して、対象から「RCS」ディレクトリ配下を除外する場合。
find ./ -name ".*" -not -path '*/RCS/*'
5. リンク切れのシンボリックリンクを探す
まぁ、こういう用途があるわけです。
これが、「FreeBSD」と「Linux」でオプションが異なるのでちょっと厄介。
「FreeBSD」の場合。
find -L /パス -type l
「Linux」の場合。
find -xtype l
となります。
てことで、リンク切れのシンボリックリンクを削除したい場合は。
「FreeBSD」の場合。
find -L /パス -type l | xargs rm
「Linux」の場合。
find -xtype l | xargs rm
となります。
6. 古いファイルを削除する
わたしは、意図しないで削除されるのを好まないので、「/tmp」の下も自動で削除するような設定をしておりません。
すると、「/tmp」の中が、ごちゃごちゃしてきました。
一定の特徴を持つもので、一定期間が過ぎたものを削除したい・・・。
「-mtime n」オプションを使うです。
find /tmp -name '*.log' -mtime +30 -delete
上記の場合は、拡張子「.log」で、30日経過したものを削除することになります。
ディレクトリ指定、ワイルドカード、経過期日等を組み合わせれば、自由自在です。