Find (UNIX)

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です。

参考資料



もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。