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

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

1. 概要

 ディレクトリツリーを再帰的に下って、ファイルを検索します。  本ページは、下記のサイトを参考にさせていただきました。
find で特定パスを除外してファイル名を検索する方法」
「【FreeBSD】リンク切れのシンボリックリンクを探す方法 FreeBSD 編」
「リンク切れのシンボリックリンクを探す方法」
「【Linux】一定期間経過したディレクトリやファイルを削除する方法 #Linuxコマンド
 基本形は。

find パス名 [オプション] [ファイル名]
 わたしが使用する主なオプションは以下の通り。
オプション 意    味
-follow シンボリックファイルをたどります(デフォルトはシンボリックリンクをたどらない)
-mtime n 最後にファイルが修正された時刻からの日数分経過したものを検索
-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
 あるいは、「-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日経過したものを削除することになります。  ディレクトリ指定、ワイルドカード、経過期日等を組み合わせれば、自由自在です。
ハイスピードプラン損保との違いPoint anytime