.\" Copyright (c) 1998 Andries Brouwer
.\"
.\" %%%LICENSE_START(GPLv2+_DOC_FULL)
.\" This is free documentation; you can redistribute it and/or
.\" modify it under the terms of the GNU General Public License as
.\" published by the Free Software Foundation; either version 2 of
.\" the License, or (at your option) any later version.
.\"
.\" The GNU General Public License's references to "object code"
.\" and "executables" are to be interpreted as the output of any
.\" document formatting or typesetting system, including
.\" intermediate and printed output.
.\"
.\" This manual is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public
.\" License along with this manual; if not, see
.\" .
.\" %%%LICENSE_END
.\"
.\" 2003-08-24 fix for / by John Kristoff + joey
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" Japanese Version Copyright (c) 1998 NAKANO Takeo all rights reserved.
.\" Translated Wed 12 Aug 1998 by NAKANO Takeo
.\" Updated 2003-09-28 by NAKANO Takeo
.\" Updated 2012-05-06, Akihiro MOTOKI
.\"
.TH GLOB 7 2020\-08\-13 Linux "Linux Programmer's Manual"
.SH 名前
glob \- パス名を glob する
.SH 説明
昔々 UNIX\ V6 では、ワイルドカードパターンを展開する \fI/etc/glob\fP と言うプログラムがあった。その後すぐに、
この機能はシェルに組み込まれるようになった。
.PP
今日では、この機能をユーザープログラムからも実行できるよう、 \fBglob\fP(3) というライブラリルーチンも存在している。
.PP
glob の規則を以下に述べる (POSIX.2 3.13)。
.SS ワイルドカードマッチ
文字列に \(aq?\(aq, \(aq*\(aq, \(aq[\(aq が含まれていると、 それはワイルドカードパターンとみなされる。 「glob
する」というのは、ワイルドカードパターンを展開して、 そのパターンにマッチするパス名のリストを得ることである。 マッチは以下のように定義される。
.PP
(ブラケット外部の) \(aq?\(aq はあらゆる単一の文字にマッチする。
.PP
(ブラケット外部の) \(aq*\(aq はあらゆる文字列にマッチする。 空文字列 (empty string) にもマッチする。
.PP
\fB文字クラス (character class)\fP
.PP
"\fI[...]\fP" と言う表記は、先頭の \(aq[\(aq に続く最初の文字が \(aq!\(aq で
なければ、ブラケットの中に含まれている文字のどれか一つにマッチする。 ブラケットの内部に含まれる文字列は空であってはならない。 したがって
\(aq]\(aq も最初の文字に指定すればブラケットの内部に含めることが できる (つまり "\fI[][!]\fP" は \(aq[\(aq,
\(aq]\(aq, \(aq!\(aq の 3 文字のどれかにマッチする)。
.PP
\fB領域指定 (range)\fP
.PP
特殊な表記法が一つ存在する。\(aq\-\(aq を挟む二つの文字は領域指定となる。 (つまり "\fI[A\-Fa\-f0\-9]\fP" は
"\fI[ABCDEFabcdef0123456789]\fP" と等価となる。) \(aq\-\(aq 文字そのものを入れたい場合は、
ブラケットの先頭または最後の文字に指定すればよい。 (つまり "\fI[]\-]\fP" は二つの文字 \(aq]\(aq と \(aq\-\(aq
にマッチし、"\fI[\-\-0]\fP" は \(aq\-\(aq, \(aq.\(aq, \(aq0\(aq の 3 文字にマッチする。この間の
\(aq/\(aq にはマッチしない。後述を参照。)
.PP
\fB補集合 (complementation)\fP
.PP
"\fI[!...]\fP" と言う表記は、ブラケットの内部に含まれない単一の文字にマッチする (ただし先頭にある \(aq!\(aq は除外)。 (つまり
"\fI[!]a\-]\fP" は \(aq]\(aq, \(aqa\(aq, \(aq\-\(aq 以外のすべての文字の、どれか一つにマッチする。)
.PP
バックスラッシュ \(aq\e\(aq を前置すれば、 \(aq?\(aq, \(aq*\(aq, \(aq[\(aq は通常の文字として扱われる。
またはシェルのコマンドラインの一部に指定する場合は、 クォートで囲っても同じ効果が得られる。ブラケットの内部では、
これらの文字はその文字自身だけを意味する。 すなわち "\fI[[?*\e]\fP" は \(aq[\(aq, \(aq?\(aq, \(aq*\(aq,
\(aq\e\(aq のどれか一文字にマッチする。
.SS "パス名 (pathname)"
glob 動作は、パス名のそれぞれの部分に独立に適用される。 パス名に存在する \(aq/\(aq は \(aq?\(aq や \(aq*\(aq
ワイルドカードにはマッチしない。 また "\fI[.\-0]\fP" のような領域指定にもマッチしない。陽に \(aq/\(aq
文字を含む領域指定は文法的に正しくない。 (POSIX の要件では、文法的に正しくないパターンは変更せずにそのままにすることになっている。)
.PP
\(aq.\(aq で始まるパス名では、この文字は陽にマッチさせなければならない。 (つまり \fIrm\ *\fP は .profile を削除しない。また
\fItar\ c\ *\fP ではすべてのファイルはアーカイブされない。 \fItar\ c\ .\fP の方が良い。)
.SS 空のリスト
先に与えた、わかりやすく簡単なルール、 「ワイルドカードパターンをマッチしたパス名のリストに展開する」と言うのは、 オリジナルの UNIX
における定義であった。 これはパターンが空のリストに展開されることも許可されていた。 例えば
.PP
.nf
xv \-wait 0 *.gif *.jpg
.fi
.PP
において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにならない。 しかし POSIX
では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そのまま変更されずに残されることになっている。 \fIbash\fP
では、次のコマンドで昔からの振る舞いに設定することができる。
.PP
.\" In Bash v1, by setting allow_null_glob_expansion=true
shopt \-s nullglob
.PP
(同様の問題は別のところでも起こっている。例えば、古いスクリプトにおける
.PP
.nf
rm \`find . \-name "*\(ti"\`
.fi
.PP
のような記述は、新しいスクリプトでは
.PP
.nf
rm \-f nosuchfile \`find . \-name "*\(ti"\`
.fi
.PP
のようにしなければならない。さもないと \fIrm\fP を引数リストなしで呼び出す可能性があり、 エラーメッセージが出てしまう。)
.SH 注意
.SS 正規表現
ワイルドカードパターンは正規表現と多少似ているが、しかしこの両者は異なる。 まず第一に、前者がファイル名にマッチするのに対して、
後者はテキストにマッチする。第二に、ルールも同じではない。 例えば正規表現における \(aq*\(aq は、 前置された文字の 0
以上の繰り返しを表す。
.PP
正規表現にもブラケット表現はあるが、否定は \(aq\(ha\(aq でなされる。 POSIX ではワイルドカードパターンにおける
"\fI[\(ha...]\fP" を未定義であるとしている。
.SS 文字クラスと国際化
領域指定は、もともとはもちろん ASCII における順序並びを意味していた。 したがって "\fI[\ \-%]\fP" は "\fI[\ !"#$%]\fP"
の意味であり、 "\fI[a\-z]\fP" は「すべての小文字」の意味であった。 UNIX の実装の中には、これを拡張したものが存在し、 そこでは X\-Y
という領域指定は、X のコードと Y のコードに挟まれたコードを持つ文字すべてを表すようになっていた。
しかし、これにはユーザーがローカルなシステムにおける 文字コードを知らなければならず、 さらにローカルなアルファベットに対する照合順序
(collating sequence) が文字コードの順序と異なっている場合には不便であった。 (訳注: collating sequence
に関しては \fBregex\fP(7) を参照して下さい。) したがって POSIX では、ワイルドカードパターンと正規表現の双方において、
ブラケット表記を大幅に拡張している。 これまで我々は、ブラケット表記には三つの要素が含まれうることを見てきた。 すなわち (i) 否定、(ii)
単一の文字、(iii) 領域指定、の三つである。 POSIX では、領域指定をより国際化に便利なように定義しており、
また三つのタイプをブラケット表記の要素として追加している。
.PP
(iii) 領域指定 X\-Y は X と Y に挟まれた (両端含む) すべての文字を意味する。 このとき、カレントロケール (current
locale) の \fBLC_COLLATE\fP カテゴリーで定義されている照合順序が用いられる。
.PP
(iv) 名前付き文字クラス: 以下のようなものである。
.PP
.nf
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
.fi
.PP
これを用いれば "\fI[a\-z]\fP" の代わりに "\fI[[:lower:]]\fP" のような指定ができる。 またデンマークのように、アルファベットの
\(aqz\(aq 以降に 3 つの文字が存在するような場合でも、同じような動作が期待できる。 これらの文字クラスはカレントロケールの
\fBLC_CTYPE\fP カテゴリーで定義されている。
.PP
(v) 照合順序におけるシンボル: "\fI[.ch.]\fP" や "\fI[.a\-acute.]\fP" のように "\fI[.\fP" と "\fI.]\fP"
で挟まれた文字列は、カレントロケールで定義された照合順序の要素となる。 ある一つの要素が複数の文字からなる場合もありうることに注意。
.PP
(vi) 等価クラス表現 (equivalence class expressions):
"\fI[=a=]\fP" のように "\fI[=\fP" と "\fI=]\fP" とで挟まれた文字列であり、
カレントロケールで定義された等価クラスのメンバーである照合要素のいずれかを表す。
例えば、"\fI[[=a=]]\fP" は "\fI[a\('a\(\`a\(:a\(^a]\fP"、つまり
"\fI[a[.a\-acute.][.a\-grave.][.a\-umlaut.][.a\-circumflex.]]\fP" と等価になる。
.SH 関連項目
\fBsh\fP(1), \fBfnmatch\fP(3), \fBglob\fP(3), \fBlocale\fP(7), \fBregex\fP(7)
.SH この文書について
この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
\%https://www.kernel.org/doc/man\-pages/ に書かれている。