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

 クラウディア
1. 基本形
2. ディレクトリ内のファイル数やディレクトリ数を調べる
3. xargs と組み合わせる
4. 特定のディレクトリを除外する
5. リンク切れのシンボリックリンクを探す

1. 基本形

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

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

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

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

ファイルタイプ  意味 
b ブロック型特殊ファイル
c キャラクタ型特殊ファイル
d ディレクトリ
f 普通のファイル
l シンボリックリンク
p FIFO
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

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
 となります。
U-NEXT
 
 
カウンタバックグラウンド