2.3.2 完全なファイル名のパターン
- テスト: -path pattern
- テスト: -wholename pattern
そのファイルが見つかった起点となるコマンド行引数から始まる完全なファイル名が、シェルパターンpatternに一致すると真になります。ディレクトリツリー全体を対象から外すには、ツリー内の各ファイルを調べる代わりに「-prune」を使います(ディレクトリを参照)。
findがいう「完全なファイル名」は、コマンド行で指定した開始点から始まり、絶対パス名に変換されません。そのため、たとえばcd /; find tmp -wholename /tmpが何かに一致することはありません。findは「-path」の引数を、対象ファイルのディレクトリ名とベース名を連結したものと比較します。連結した結果がスラッシュで終わることはないため、「-path」の引数が「/」で終わる場合、何にも一致しません。ただし、コマンド行で指定した開始点には一致する可能性があります。
「-wholename」という名前はGNU固有ですが、「-path」のほうは移植性が高くなっています。後者はHP-UXの
findが対応しており、IEEE Std 1003.1-2008以降のPOSIX標準にも含まれています。
- テスト: -ipath pattern
- テスト: -iwholename pattern
これらのテストは「-wholename」と「-path」と同様ですが、大文字と小文字を区別せずに照合します。
「-path」「-wholename」「-ipath」「-iwholename」テストの文脈でいう「フルパス」は、findの開始点から対象ファイルに至るまでに通るすべてのディレクトリ名と、ファイルそのもののベース名を連結したものです。これらのパスは、絶対パスとは限りません。たとえば、次のようになります。
$ cd /tmp $ mkdir -p foo/bar/baz $ find foo -path foo/bar -print foo/bar $ find foo -path /tmp/foo/bar -print $ find /tmp/foo -path /tmp/foo/bar -print /tmp/foo/bar
/tmp/foo/barが存在し、findが調べているにもかかわらず、2番目のfindコマンドは何も表示しないことに注意してください。
コマンド行でのファイル名展開とは異なり、パターン中の「*」は「/」にも、ファイル名の先頭のドットにも一致します。
$ find . -path '*f' ./quux/bar/baz/f $ find . -path '*/*config' ./quux/bar/baz/.config
- テスト: -regex expr
- テスト: -iregex expr
完全なファイル名が正規表現exprに一致すると真になります。これはパス全体の一致を調べるもので、部分文字列を検索するものではありません。たとえば、./fubar3という名前のファイルに一致させるには、正規表現「.*bar.」または「.*b.*3」を使えますが、「f.*r3」は使えません。「-iregex」では大文字と小文字を区別しません。
「-path」と同様に、照合対象のファイル名がスラッシュで終わることはないため、スラッシュで終わるものだけに一致する正規表現は常に失敗します。
正規表現にはいくつかの種類があります。このテストでは既定でGNU Emacsの正規表現を使いますが、「-regextype」オプションで変更できます。
- オプション: -regextype name
このオプションは、「-regex」と「-iregex」テストが解釈する正規表現構文の種類を指定します。このオプションは位置に依存し、コマンド行でそれより後に現れる正規表現だけに影響します。指定しない場合は、GNU Emacsの正規表現を使います。現在実装されている種類は次のとおりです。
- ‘emacs’
GNU Emacsと互換性のある正規表現です。このオプションを使わない場合の既定の動作でもあります。
- ‘posix-awk’
POSIXのawkコマンドと互換性のある正規表現です。GNU awkではありません。
- ‘posix-basic’
POSIXの基本正規表現です。
- ‘posix-egrep’
POSIXのegrepコマンドと互換性のある正規表現です。
- ‘posix-extended’
POSIXの拡張正規表現です。
GNU findutilsが解釈する正規表現の各方言については、正規表現を参照してください。