コマンドリファレンス - find ファイルの検索

 
1. 基本形
2. ディレクトリ内のファイル数やディレクトリ数を調べる
3. xargs と組み合わせる
4. 特定のディレクトリを除外する

1. 基本形

 ディレクトリツリーを再帰的に下ってファイルを検索します。

> find パス名 [オプション] [ファイル名]
 わたしが使用する主なオプションは以下の通り
オプション 意味
-follow シンボリックファイルをたどります(デフォルトはシンボリックリンクをたどらない)
-name ファイル名 ファイル名に該当するファイルを検索します
-type ファイルタイプ タイプに相当するファイルを検索します

 -name 指定でファイル名にワイルドカードを使用するときは "(ダブルコーテーション)で囲みます。

 ファイルタイプの指定は以下の通り (普通に使用するのは「b」「c」「l」くらいでしょう)

ファイルタイプ 意味
bブロック型特殊ファイル
cキャラクタ型特殊ファイル
dディレクトリ
f普通のファイル
lシンボリックリンク
pFIFO
sソケット

 応用例を下に例示します。


> 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