Provided by: manpages-ja_0.5.0.0.20221215+dfsg-1_all
名前
glob - パス名を glob する
説明
昔々 UNIX V6 では、ワイルドカードパターンを展開する /etc/glob と言うプログラムがあった。そ の後すぐに、 この機能はシェルに組み込まれるようになった。 今日では、この機能をユーザープログラムからも実行できるよう、 glob(3) というライブラリルー チンも存在している。 glob の規則を以下に述べる (POSIX.2 3.13)。 ワイルドカードマッチ 文字列に '?', '*', '[' が含まれていると、 それはワイルドカードパターンとみなされる。 「glob する」というのは、ワイルドカードパターンを展開して、 そのパターンにマッチするパス名 のリストを得ることである。 マッチは以下のように定義される。 (ブラケット外部の) '?' はあらゆる単一の文字にマッチする。 (ブラケット外部の) '*' はあらゆる文字列にマッチする。 空文字列 (empty string) にもマッチす る。 文字クラス (character class) "[...]" と言う表記は、先頭の '[' に続く最初の文字が '!' で なければ、ブラケットの中に含ま れている文字のどれか一つにマッチする。 ブラケットの内部に含まれる文字列は空であってはなら ない。 したがって ']' も最初の文字に指定すればブラケットの内部に含めることが できる (つま り "[][!]" は '[', ']', '!' の 3 文字のどれかにマッチする)。 領域指定 (range) 特殊な表記法が一つ存在する。'-' を挟む二つの文字は領域指定となる。 (つまり "[A-Fa-f0-9]" は "[ABCDEFabcdef0123456789]" と等価となる。) '-' 文字そのものを入れたい場合は、 ブラケッ トの先頭または最後の文字に指定すればよい。 (つまり "[]-]" は二つの文字 ']' と '-' にマッチ し、"[--0]" は '-', '.', '0' の 3 文字にマッチする。この間の '/' にはマッチしない。後述を 参照。) 補集合 (complementation) "[!...]" と言う表記は、ブラケットの内部に含まれない単一の文字にマッチする (ただし先頭にあ る '!' は除外)。 (つまり "[!]a-]" は ']', 'a', '-' 以外のすべての文字の、どれか一つにマッ チする。) バックスラッシュ '\' を前置すれば、 '?', '*', '[' は通常の文字として扱われる。 またはシェ ルのコマンドラインの一部に指定する場合は、 クォートで囲っても同じ効果が得られる。ブラケッ トの内部では、 これらの文字はその文字自身だけを意味する。 すなわち "[[?*\]" は '[', '?', '*', '\' のどれか一文字にマッチする。 パス名 (pathname) glob 動作は、パス名のそれぞれの部分に独立に適用される。 パス名に存在する '/' は '?' や '*' ワイルドカードにはマッチしない。 また "[.-0]" のような領域指定にもマッチしない。陽に '/' 文字を含む領域指定は文法的に正しくない。 (POSIX の要件では、文法的に正しくないパターンは変 更せずにそのままにすることになっている。) '.' で始まるパス名では、この文字は陽にマッチさせなければならない。 (つまり rm * は .profile を削除しない。また tar c * ではすべてのファイルはアーカイブされない。 tar c . の 方が良い。) 空のリスト 先に与えた、わかりやすく簡単なルール、 「ワイルドカードパターンをマッチしたパス名のリスト に展開する」と言うのは、 オリジナルの UNIX における定義であった。 これはパターンが空のリス トに展開されることも許可されていた。 例えば xv -wait 0 *.gif *.jpg において、*.gif ファイルが全くない場合でも、 これは空のリストに展開されるため、エラーにな らない。 しかし POSIX では、文法的に正しくないパターンや、 マッチがなかったパターンは、 そ のまま変更されずに残されることになっている。 bash では、次のコマンドで昔からの振る舞いに設 定することができる。 shopt -s nullglob (同様の問題は別のところでも起こっている。例えば、古いスクリプトにおける rm `find . -name "*~"` のような記述は、新しいスクリプトでは rm -f nosuchfile `find . -name "*~"` のようにしなければならない。さもないと rm を引数リストなしで呼び出す可能性があり、 エラー メッセージが出てしまう。)
注意
正規表現 ワイルドカードパターンは正規表現と多少似ているが、しかしこの両者は異なる。 まず第一に、前 者がファイル名にマッチするのに対して、 後者はテキストにマッチする。第二に、ルールも同じで はない。 例えば正規表現における '*' は、 前置された文字の 0 以上の繰り返しを表す。 正規表現にもブラケット表現はあるが、否定は '^' でなされる。 POSIX ではワイルドカードパター ンにおける "[^...]" を未定義であるとしている。 文字クラスと国際化 領域指定は、もともとはもちろん ASCII における順序並びを意味していた。 したがって "[ -%]" は "[ !"#$%]" の意味であり、 "[a-z]" は「すべての小文字」の意味であった。 UNIX の実装の中 には、これを拡張したものが存在し、 そこでは X-Y という領域指定は、X のコードと Y のコード に挟まれたコードを持つ文字すべてを表すようになっていた。 しかし、これにはユーザーがローカ ルなシステムにおける 文字コードを知らなければならず、 さらにローカルなアルファベットに対す る照合順序 (collating sequence) が文字コードの順序と異なっている場合には不便であった。 (訳 注: collating sequence に関しては regex(7) を参照して下さい。) したがって POSIX では、ワ イルドカードパターンと正規表現の双方において、 ブラケット表記を大幅に拡張している。 これま で我々は、ブラケット表記には三つの要素が含まれうることを見てきた。 すなわち (i) 否定、(ii) 単一の文字、(iii) 領域指定、の三つである。 POSIX では、領域指定をより国際化に便利なように 定義しており、 また三つのタイプをブラケット表記の要素として追加している。 (iii) 領域指定 X-Y は X と Y に挟まれた (両端含む) すべての文字を意味する。 このとき、カレ ントロケール (current locale) の LC_COLLATE カテゴリーで定義されている照合順序が用いられ る。 (iv) 名前付き文字クラス: 以下のようなものである。 [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] これを用いれば "[a-z]" の代わりに "[[:lower:]]" のような指定ができる。 またデンマークのよ うに、アルファベットの 'z' 以降に 3 つの文字が存在するような場合でも、同じような動作が期待 できる。 これらの文字クラスはカレントロケールの LC_CTYPE カテゴリーで定義されている。 (v) 照合順序におけるシンボル: "[.ch.]" や "[.a-acute.]" のように "[." と ".]" で挟まれた 文字列は、カレントロケールで定義された照合順序の要素となる。 ある一つの要素が複数の文字か らなる場合もありうることに注意。 (vi) 等価クラス表現 (equivalence class expressions): "[=a=]" のように "[=" と "=]" とで挟 まれた文字列であり、 カレントロケールで定義された等価クラスのメンバーである照合要素のいず れかを表す。 例えば、"[[=a=]]" は "[aáaäâ]"、つまり "[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]" と等価になる。
関連項目
sh(1), fnmatch(3), glob(3), locale(7), regex(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの 説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。