今回は,ファイルの検索方法と正規表現の基礎を具体的に紹介します。基礎の基礎なので,しっかりと覚えておきましょう。
前回 は,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
最初のlsコマンドでは,/binディレクトリ以下にある,ファイル名が「m」で始まるファイルを表示しています。次のlsコマンドでは,ファイル名が「m」ともう1文字からなるファイルを表示しています。
ところで,「*」や「?」を解釈しているのはlsコマンドではありません。第5回「Linuxコマンド入門(その2:パス,ユーザー権限,パーミッションを理解する) 」で解説した「シェル」が解釈を担当しています。
例えばコマンドラインで「ls /bin/m?」が入力されると,シェルは「ls /bin/mt /bin/mv」のように展開してからlsコマンドを実行しています。シェルは「*」「?」以外にも,任意の文字を表す特殊文字があります。それらの文字のことをシェルのメタキャラクタ(表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
「?」の使用例
まずは「?」を使ってみます。図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
「*」の使用例
次は「*」の使用例です。図4を見てください。(3)では,ファイル名が任意の1文字+「1.txt」であるファイルを表示します。「1.txt」も含まれていることに注意してください。「*」には「0文字」も含まれるからです。
$ ls *1.txt ← (3)
1.txt 11.txt 21.txt 31.txt 41.txt 51.txt
「[ ]」の使用例
最後は「[ ]」の使用例です。具体例を以下の図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
(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」となるファイルにマッチします。