findコマンドについて
findコマンドは、主に
Unix系プラットフォームで利用される
ディレクトリ検索プログラムです。指定された
ディレクトリツリーを探索し、ユーザーが指定した条件に一致するファイルや
ディレクトリを検出します。基本的には、現在の作業
ディレクトリ以下にあるすべてのファイルが
検索対象となります。findコマンドの強力な点は、
検索結果に対して様々なアクションを実行できることです。これにより、大量のファイルを効率的に操作することが可能になります。
findコマンドでは、`-regex`や`-iregex`オプションを用いることで、
正規表現によるパス名のマッチングが可能です。GNU版のfindは複数の
正規表現文法に対応しており、`-regextype`オプションで文法を切り替えることができます。
基本的な使用例
bash
find . -name 'my'
この例では、カレント
ディレクトリとそのサブ
ディレクトリ内にある、ファイル名が`my`で始まるすべてのファイルと
ディレクトリを
検索します。クォートで囲むことで、シェルによるワイルドカード展開を防ぎ、findコマンドに直接`my`というパターンを渡します。
ファイルのみを検索
bash
find . -name my\ -type f
この例では、上記の
検索結果から、ファイルタイプが通常ファイルであるもののみを絞り込みます。``の前にバックスラッシュを置くことで、シェルの解釈を回避します。
また、`-type f -name my\`のように、式の順序を入れ替えても結果は同じです。
アクションの指定
findコマンドは、デフォルトでは
検索結果をリスト表示しますが、`-ls`オプションを使うと、`ls`コマンドのように詳細な情報を表示できます。
bash
find . -type f -name 'my' -ls
bash
find / -type f -iname myfile -print
この例では、コンピュータ全体から、名前が`myfile`(大文字小文字を区別しない)である通常ファイルを
検索します。ただし、`/`を指定して全領域を
検索するのは非常に時間がかかるため、できるだけ範囲を絞るべきです。
bash
find /home/brian -type f -name myfile -print
この例では、`/home/brian`
ディレクトリ以下にある、名前が`myfile`である通常ファイルを
検索します。
bash
find local /tmp -type d -name mydir -print
この例では、カレント
ディレクトリの`local`サブ
ディレクトリと`/tmp`
ディレクトリ内から、名前が`mydir`である
ディレクトリを
検索します。
エラーを無視する
アクセス権限がないなどの理由でエラーが表示される場合は、以下のように標準エラー出力を`/dev/null`にリダイレクトすることで、エラー表示を抑制できます。
bash
find / -type f -name myfile -print 2> /dev/null
複数のファイル名を検索
bash
find . -type f \( -name 'jsp' -or -name 'java' \) -ls
この例では、ファイル名が`jsp`または`java`で終わるファイルを
検索します。`or`は`o`と省略可能です。括弧はシェルによって解釈されないようにエスケープする必要があります。
コマンド実行
bash
find /var/ftp/mp3 -type f -iname '.mp3' -exec chmod 744 {} \;
この例では、`/var/ftp/mp3`
ディレクトリ以下にある、名前が`.mp3`で終わるすべてのMP3ファイルのパーミッションを`744`に変更します。`-exec`オプションで指定したコマンドは、見つかったファイルごとに実行されます。`{}`はファイル名に置換され、`\;`はコマンドの終了を示します。
xargsとの連携
bash
find /var/ftp/mp3 -type f -iname '.mp3' -print | xargs chmod 744
`-exec`オプションはファイルごとにプロセスを起動するため効率が悪い場合があります。`-print`で出力した結果を`xargs`に渡すことで、複数ファイルをまとめて処理できます。
GNU版のfindには、ファイル名を
ヌル文字区切りで出力する`-print0`オプションがあり、`xargs -0`と組み合わせることで、空白を含むファイル名も正しく処理できます。
ファイル内の文字列検索
bash
find /tmp -exec grep "search string" '{}' /dev/null \; -print
この例では、`/tmp`
ディレクトリ以下にあるすべてのファイルから`search string`という文字列を
検索します。`/dev/null`は、ファイル名を表示するために必要です。grepの`-H`オプションを使うことで同様の結果が得られます。
bash
find /tmp -exec grep -H "search string" '{}' \; -print
あるいは、GNU grepであれば以下のように単独で実行できます。
bash
grep -R /tmp "search string"
bash
find ~jsmith -exec grep "LOG" '{}' /dev/null \; -print
この例では、`jsmith`ユーザーのホーム
ディレクトリで`LOG`という文字列を
検索します。
XMLファイルを検索
bash
find . -type f -iname '*.xml' -exec grep "ERROR" '{}' \; -print
この例では、カレント
ディレクトリ以下にあるすべてのXMLファイルから`ERROR`という文字列を
検索します。
特定ユーザーが所有するファイルを検索
bash
find . -user
この例では、カレントディレクトリ以下にある、指定されたユーザーIDが所有するすべてのファイルを検索します。
Windows/MS-DOS版のfind
Windows/MS-DOSのfindコマンドは、Unix版とは異なり、ファイル内の文字列を検索する機能(fgrep相当)を提供します。grepに相当するコマンドはfindstrです。
参考資料