応用例を下に例示します。
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
5. リンク切れのシンボリックリンクを探す
まぁ、こういう用途があるわけです。
これが、「FreeBSD」と「Linux」でオプションが異なるのでちょっと厄介。
本項は、下記のサイトを参考にさせていただきました(上が「FreeBSD」、下が「Linux」)。
「【FreeBSD】リンク切れのシンボリックリンクを探す方法FreeBSD編 - Qiita」
「リンク切れのシンボリックリンクを探す方法 - Qiita」
「FreeBSD」の場合
find -L /パス -type l
「Linux」の場合
find -xtype l
となります。
てことで、リンク切れのシンボリックリンクを削除したい場合は、
「FreeBSD」の場合
find -L /パス -type l | xargs rm
「Linux」の場合
find -xtype l | xargs rm
となります。