fnmatch - ファイル名のパターンマッチング
次に説明するパターンマッチング表記法を使用して、シェル内で一致する文字列のパターンを指定します。従来のパターンマッチング表記法も正規表現に対応していますが、若干異なっています。このため、このパターンマッチング表記法の規則については、regex(5) のマニュアルページで記述されている正規表現表記法に基づいて説明します。
次の単一の文字を照合するパターンは、単一の文字 (通常の文字、特殊パターン文字、パターンブラケット表現) を照合します。パターンブラケット表現は、単一の照合要素もマッチングします。
通常の文字とは、その文字自体を照合するパターンです。NUL、引用符を必要とする特殊なシェル文字、および次の 3 つの特殊パターン文字を除いて、サポートされる文字セットに任意の文字を指定できます。マッチングは文字のグラフィック表現ではなく、文字のエンコーディングに使用されるビットパターンに基づいて行なわれます。任意の文字 (通常、シェル特殊、特殊パターン) に引用符を付けると、そのパターンはその文字自体を照合します。シェル特殊文字には、常に引用符が必要です。
引用符なしで、ブラケット表現以外の次の 3 つの文字には、パターン指定において特別な意味があります:
疑問符は任意の文字を照合するパターンです。
後述の「複数の文字を照合するパターン」で説明するように、アスタリスクは複数の文字を照合するパターンです。
開始括弧から、パターンブラケット表現が導入されます。
regex(5) のマニュアルページに記述された基本正規表現におけるブラケット表現についての説明は、正規表現表記法では一致しないリストの役割において感嘆符 ( ! ) がサーカムフレックス文字 (^) に置換される点を除いて、パターンブラケット表現にも当てはまります。引用符なしのサーカムフレックス文字でブラケット表現が始まる場合は、不特定の結果が発生します。
ブラケット表現でサーカムフレックスを制限すると、感嘆符に加えてサーカムフレックスを否定文字として使用するパターンマッチングをサポートする実装が可能になります。移植性のあるアプリケーションでどちらかの文字をマッチングするには、[\^!] などを使用する必要があります。
シェルの引用符が削除されていない (exec 関数のいずれかを使用して find が呼び出されるときの find –name 一次子への引数や、fnmatch(3C) 関数への pattern 引数など) パターンマッチングが使用されている場合は、特殊文字の前にバックスラッシュ文字を付けてエスケープすれば、特殊な意味を取り除くことができます。このようなエスケープするバックスラッシュは破棄されます。シーケンス \ \ は 1 つのリテラルバックスラッシュを表します。通常の文字、特殊なシェル文字、および特殊なパターン文字に引用符を付ける要件および効果はすべて、このコンテキストのエスケープに適用されます。
パターンマッチングは 3 つの別々の状況で動作する必要があるため、ここでは引用符とエスケープの両方について説明します。
シェルで直接呼び出す (パス名の展開や case 文など)。次のパターンはすべて、文字列またはファイル abc を照合します。
|
次は照合しません:
|
シェルを介さずにユーティリティーや関数を呼び出す (find(1) および関数 fnmatch(3C) を参照)。
シェルコマンド行を介して find、cpio、tar、pax などのユーティリティーを呼び出す。この場合、ユーティリティーで引数が現れる前に、シェルの引用符が削除されます。例:
find /bin -name e\c[\h]o -print
引用符が削除されたあとに、バックスラッシュが find に渡され、エスケープ文字として処理されます。どちらも通常の文字の前に付加されているため、c と h はその文字自体を意味し、echo は (/bin にある) 従来の多くのシステムで見つかります。特殊なシェル文字やパターン文字が含まれるファイル名を検索するには、次のように、引用符とエスケープ文字の両方が必要です:
pax -r . . . "*a\ ( \?"
この目的は、a(? で終わるファイル名を抽出することです。
特殊なシェル文字 (メタ文字とも呼ばれる) に引用符やエスケープ文字を付けるには、規格に準拠するアプリケーションが必要です。このような保護なしで使用すると、構文エラーが発生したり、実装の拡張機能がトリガーされたりする可能性があります。たとえば、KornShell のパターンでは、括弧に基づく一連の拡張機能がサポートされています。ksh(1) を参照してください。
次の規則は、単一の文字を照合するパターンから複数の文字を照合するパターンを構成する際に使用されます。
アスタリスク (*) は、null 文字列を含む任意の文字列を照合するパターンです。
単一の文字を照合するパターンの連結は、単一の文字を連結したものや各連結パターンで一致する照合要素と一致する有効なパターンです。
1 つ以上の単一の文字を照合するパターンと 1 つ以上のアスタリスクとの連結は、有効なパターンです。このようなパターンでは、各アスタリスクは 0 文字以上の文字列を照合し、パターンの残りの部分が文字列と最長一致する文字を照合できます。
各アスタリスクは 0 回以上の繰り返しを照合するため、パターン a*b と a**b のはたらきはまったく同じです。
たとえば、
文字列 ab および ac に一致します。
文字列 ad、abd、および abcd と一致しますが、文字列 abc とは一致しません。
文字列 ad、abcd、abcdef、aaaad、および adddd と一致します。
文字列 ad、abcd、efabcd、aaaad、および adddd と一致します。
これまでに「複数の文字を照合するパターン」および「単一の文字を照合するパターン」で説明した規則は、パターンマッチング表記法がファイル名の展開で使用されるときに適用される次の規則によって限定されます。
パス名のスラッシュ文字は、パターン内で 1 つ以上のスラッシュを使用して明示的に照合する必要があり、アスタリスクや疑問符などの特殊文字またはブラケット表現で照合することはできません。パターン内のスラッシュは、ブラケット表現の前に識別されるため、ファイル名の展開に使用されるパターンブラケット表現にスラッシュを含めることはできません。たとえば、パターン a[b/c]d は、abd や a/d などのパス名と一致します。文字どおり a[b/c]d のパス名のみと一致します。
ファイル名がピリオド (.) から始まる場合は、パターンの最初の文字としてピリオドを使用するか、直後にスラッシュ文字を付けて、ピリオドを明示的に照合する必要があります。次のパターンでは、先頭のピリオドは照合されません:
· アスタリスクや疑問符などの特殊文字
· 次のような一致しないリストを含むブラケット表現:
[!a]
次のような範囲表現:
[%-0]
または、次のような文字クラス表現:
[[:punct:]]
次のように、ブラケット表現マッチングリスト内の明示的なピリオドが、
[.abc]
ファイル名の先頭ピリオドを照合できるかどうかは指定されません。
必要に応じて、指定されたパターンは既存のファイル名およびパス名と照合されます。各コンポーネントにパターン文字が含まれている場合は、そのコンポーネントを含むディレクトリに読み取り権限が必要です。コンポーネント (最後のコンポーネントを除く) にパターン文字が含まれていない場合は、検索権限が必要です。たとえば、次のパターンがあるとします:
/foo/bar/x*/bam
ディレクトリ / および foo には検索権限、ディレクトリ bar には検索権限および読み取り権限、各 x* ディレクトリには検索権限が必要です。
パターンが既存のファイル名またはパス名と一致すると、それらのファイル名とパス名に置き換えられ、現在のロケールで有効な照合順序に従ってソートされます。パターンに不正なブラケット表現が含まれている場合や、既存のファイル名やパス名と一致しない場合は、パターン文字列は変更されません。