今回は,ファイルの検索方法と正規表現の基礎を具体的に紹介します。基礎の基礎なので,しっかりと覚えておきましょう。

 前回 は,Linux(Ubuntu)上でC/C++言語のコンパイルを試してみました。今回は,ファイルの検索方法と正規表現の基礎を紹介します。

 プログラミングを続けていると,いつの間にかたくさんのファイルが作られていて,「あのファイルはどこに?」と探し回ることになりかねません。今回はファイルの検索について取り上げます。

シェルのメタキャラクタ

 「拡張子が".txt"であるファイル」を表す場合,「*.txt」のように表すことができるのはご存じでしょう。任意の長さの文字列を表す「*」や,任意の1文字を表す「?」のことをワイルドカードと呼んでいますが,Linuxでも同様に「*」「?」を使うことができます。

 早速,端末を起動して試してみましょう(図1)。端末は[アプリケーション]メニューから[アクセサリ]-[端末]を指定します。

$ ls /bin/m*
/bin/mkdir  /bin/mktemp  /bin/mount  /bin/mt
/bin/mv     /bin/mknod   /bin/more   /bin/mountpoint
/bin/mt-gnu
$ ls /bin/m?
/bin/mt  /bin/mv
図1●「*」や「?」の実行例

 最初のlsコマンドでは,/binディレクトリ以下にある,ファイル名が「m」で始まるファイルを表示しています。次のlsコマンドでは,ファイル名が「m」ともう1文字からなるファイルを表示しています。

 ところで,「*」や「?」を解釈しているのはlsコマンドではありません。第5回「Linuxコマンド入門(その2:パス,ユーザー権限,パーミッションを理解する) 」で解説した「シェル」が解釈を担当しています。

 例えばコマンドラインで「ls /bin/m?」が入力されると,シェルは「ls /bin/mt /bin/mv」のように展開してからlsコマンドを実行しています。シェルは「*」「?」以外にも,任意の文字を表す特殊文字があります。それらの文字のことをシェルのメタキャラクタ(表1)といいます。

表1●シェルのメタキャラクタ
メタキャラクタ説明
*0文字以上の任意の文字列にマッチする
?任意の1文字にマッチする
[文字列][ ]内の任意の1文字にマッチする
[!文字列][ ]内の任意の1文字以外の1文字にマッチする

 以下では最初に,実習のためにファイルを作成しておきましょう。実習用ディレクトリ「globtest」を作成し,その中に30個のファイルを作ります。touchコマンドを使うと,空のファイルを作成することができます(図2)。

$ mkdir globtest
$ cd globtest
$ touch {1,2,3,4,5}.txt
$ touch {1,2,3,4,5}{1,2,3,4,5}.txt
$ ls
1.txt   13.txt  2.txt   23.txt  3.txt   33.txt  4.txt
43.txt  5.txt   53.txt
11.txt  14.txt  21.txt  24.txt  31.txt  34.txt  41.txt
44.txt  51.txt  54.txt
12.txt  15.txt  22.txt  25.txt  32.txt  35.txt  42.txt
45.txt  52.txt  55.txt
図2●実習用ディレクトリ「globtest」を作成して中に30個のファイルを作る実行例

「?」の使用例

 まずは「?」を使ってみます。図3の(1)では,ファイル名が任意の1文字+「.txt」であるファイルを表示します。(2)では,任意の2文字+「.txt」であるファイルを表示します。

$ ls ?.txt		← (1)
1.txt  2.txt  3.txt  4.txt  5.txt
$ ls ??.txt		← (2)
11.txt  14.txt  22.txt  25.txt  33.txt  41.txt
44.txt  52.txt  55.txt
12.txt  15.txt  23.txt  31.txt  34.txt  42.txt
45.txt  53.txt
13.txt  21.txt  24.txt  32.txt  35.txt  43.txt
51.txt  54.txt
図3●?の使用例

「*」の使用例

 次は「*」の使用例です。図4を見てください。(3)では,ファイル名が任意の1文字+「1.txt」であるファイルを表示します。「1.txt」も含まれていることに注意してください。「*」には「0文字」も含まれるからです。

$ ls *1.txt		← (3)
1.txt  11.txt  21.txt  31.txt  41.txt  51.txt
図4●*の使用例

「[ ]」の使用例

 最後は「[ ]」の使用例です。具体例を以下の図5に示します。

$ ls [123].txt		← (4)
1.txt  2.txt  3.txt
$ ls [1-3].txt		← (5)
1.txt  2.txt  3.txt
$ ls 1[1-3].txt		← (6)
11.txt  12.txt  13.txt
$ ls [^1-3].txt		← (7)
4.txt  5.txt
図5●[ ]の使用例

 (4)と(5)は,ファイル名が「1.txt」「2.txt」「3.txt」いずれかであるファイルにマッチします。連続した文字列は「[a-z]」「[0-9]」のように表すことができますので,(4)と(5)はまったく同じです。「12.txt」や「23.txt」にはマッチしないことに注意してください。

 (6)は,最初の1文字が「1」,次の1文字が「1」「2」「3」のいずれか,最後に「.txt」となるファイルにマッチします。(7)は,最初の1文字が「1」「2」「3」のいずれか以外,次に「.txt」となるファイルにマッチします。