Linux再入門・その2:ワイルドカードは怖いけど怖くない [Linux再入門]
Linuxをさわりたての人にとっては、正規表現・ワイルドカードというものにはたいそう抵抗感を覚えるそうで、なかなか飲み込めない・活用できないものらしい。まあ、正規表現もワイルドカードも、突き詰めていくと本が1冊かけてしまうくらい奥が深いものなので、こんなちっぽけな場末のblogじゃどうしようもないのだけども、そこまで肩肘張らずにもっと簡単に考えれば割とイージーで便利なものなんだけどねえ。
ワイルドカードとして、とにかく頻繁に使われる物として「*」(アスタリスク)がある。(見やすさを優先するため、ここでは全角のアスタリスクを使ったが、実際には半角のアスタリスクであることは言うまでもない。なお、コマンドの投入例には正規の(半角の)アスタリスクやその他の記号を用いるが、読みづらいと思うので、適宜メモ帳等にコピー&ペーストしてもらって内容を確認してもらうと良いだろう)
アスタリスクは「何でも良い」という意味がある。(笑)
たとえば、「*.conf」という記述をした場合は、「ナントカカントカ.conf」というファイルが片っ端に引っかかることになる。lsコマンドで試してみよう。/etcディレクトリの下をこのファイル指定方法で覗いてみると…
同じディレクトリで今度は「host*」と指定してみると…
ほら。よく我々が「なんだかよく分からないもの」とか「ハッキリと覚えていないもの」を言うときに、「ナントカカントカ」って言葉を使うじゃない?このワイルドカードの「*」とはまさにその「ナントカカントカ」を言う…と覚えてもらうと割と直感的に分かりやすいんじゃないかと思う。
最初の例だと口に出して発音するまんまの記述をすると「ナントカカントカ・ドット・コンフ」だし、後者の例だと「ホスト・ナントカカントカ」ということを表現している訳。
なお、「*」は何も無いも一致する。例えば、「hosts*」と指定したとする。(さっきはhost*だった)この場合…
「hosts」という文字列の後ろに何かがくっついているファイル名(なにがくっついていても良い)、「hosts.allow」とか「hosts.deny」とか「hosts~」とかが引っかかっているが、これと同時に「hosts」という文字列の後ろに何も無い、「hosts」そのものも引っかかっていることが判る。これは要するに、「*」が何でもよいという意味を持つのと同時に、無くても良いという意味を持っているからの他ならないのである。
さて。この「*」は、ファイルやディレクトリの名前の先頭や末尾で使えるだけでなく、名前の中間に位置していても一向に構わない。
ほどよく長くてほどよく面倒くさいファイル名やディレクトリを指定するときにも結構イケたりする。
例えば、「/etc/sysconfig」ディレクトリの中に…
「network-script」というディレクトリや、「networking」というディレクトリがある。bashを愛用している人は、TABキーを押してファイル名・ディレクトリ名の自動補完機能を愛用している人も多いと思うが、大抵そんなケースでは最初の2~3文字を入力してTABキーを押していると思う。が、この場合は8文字も入力しないと補完が効かないのである。いやらしいディレクトリ名である。(ま、滅多にこんなとここないけどなー)
ところが、こういう場合にはワイルドカードの方が便利だったりする。
ワイルドカードを使えばたった3文字「n*s」と記述するだけで「network-scripts」ディレクトリであることを指定できているのである。(笑)これをTABキーを使ったファイル名の補完機能を使うというのなら、「network-」まで入力しなければならない。ワイルドカードさまさまなのである。(笑)
もっと凶悪な例でいくと、例えば「/usr/local/apache2/conf」というディレクトリがあったとして、そのディレクトリの内容をlsしたい…(cdでもいいけど)とする。なんと、こんな事がまかり通ってしまうのである。
手抜きの極致である。(笑)
他に、ワイルドカードの代表的な例としては「?」(クエスチョンマーク)がある。これは何か1文字という意味になる。これは、何でもいいけど何か1文字は必要という意味になる。また、これと同じくらい(かそれよりももうちょっと)便利なのが、「[」と「]」(角カッコ)で特定の文字を囲むものである。
例えば。/devディレクトリの中に、ハードディスク等様々なデバイスファイルが配置されているが、これをいろいろなワイルドカードを使用してlsコマンドの結果を確認してみると…
① 「sd*」とした場合
ハードディスクそのものを表す、「sda」「sdb」というデバイス名と、そのディスクの中に作成されたパーティションを表す、「sda1」「sda2」といったデバイス名と両方が表示されている。
② 「sd?」とした場合
今度は、「sd」という文字に続けて何か1文字という指定だが、4文字以上のファイルは引っかかってこない。よって、「sda」「sdb」は条件に一致するので表示されるが、「sda1」「sda2」といったデバイスファイル名はここには表示されない。
で、これと同じくらい(かこれよりもうちょっと)便利な指定方法がある。例えば、「sdd1とsde1とsdf1とsdg1だけ表示したいんだけどー」という場合。こういったケースに先ほどの「[」「]」(角カッコ)を使用する。
「sd[defg]1」と、記述するのである。こうすると、角カッコで囲まれた部分は、その中の文字のいずれか1個に一致することが求められる。当然、どれか1文字は必ず必要だし、そこに含まれない文字は一致しないのである。lsコマンドで①や②と同じように実験してみよう。
③ 「sd[defg]」と指定した場合
見事にsdd、sde、sdf、sdgの4個だけが表示されている。「sd[defg]1」と指定したならこうなる。
「ふ~ん。じゃあ、aとbとcとdとeとfとgとhとiとjとkとlとmとnとを表示したい場合には、sd[abcdefghijklmn]って書く訳?」
と、ヒネた質問をしたくなってウズウズする人も出そうなので、答えておく。連続した文字の範囲を指定する場合は、省略する記述方法がある。この質問のようにaからnまでというケースでは…「sd[a-n]」というように、「-」(ハイフン)を使う。こうすると、aからnまでいちいち記述しなくてもよくなる。なお、組み合わせての指定も出来るので、
「ふ~ん。じゃあ、aとbとcとdとwとxとyとzとを表示したい場合には?」
こんなさらにヒネくれた場合には「sd[a-dw-z]」と、すれば解決なのである。どうだ参ったか。(笑)
ワイルドカードは見てもらったとおり、難しく考えなければ実はそんなに難しい代物ではないことが判ってもらえただろうか。
しかしながら、便利であるが故に危険性も少なくない特にcpコマンドやrmコマンドなどでファイルを操作する際に使用するケースなどでは、意図していなかったファイルを誤って消した・コピーした・移動したなどということが往々にして起こりうるのである。特に「*」(アスタリスク)は要注意である。うっかりどこかのディレクトリのファイルを全部…みたいなことがあり得るからね…orz
まあ、気を付けてもらいつつ、いろいろ試してみてもらいたい。ワイルドカードはなれてしまえば非常に便利なので、これを使わないというのはとってももったいないからね。
ワイルドカードとして、とにかく頻繁に使われる物として「*」(アスタリスク)がある。(見やすさを優先するため、ここでは全角のアスタリスクを使ったが、実際には半角のアスタリスクであることは言うまでもない。なお、コマンドの投入例には正規の(半角の)アスタリスクやその他の記号を用いるが、読みづらいと思うので、適宜メモ帳等にコピー&ペーストしてもらって内容を確認してもらうと良いだろう)
アスタリスクは「何でも良い」という意味がある。(笑)
たとえば、「*.conf」という記述をした場合は、「ナントカカントカ.conf」というファイルが片っ端に引っかかることになる。lsコマンドで試してみよう。/etcディレクトリの下をこのファイル指定方法で覗いてみると…
# cd /etc # ls -l *.conf -rw-r--r-- 1 root root 11 9月11日 2006 aspell.conf -rw-r--r-- 1 root root 817 11月18日 2006 cpuspeed.conf lrwxrwxrwx 1 root root 21 3月20日 2008 grub.conf -> ../boot/grub/menu.lst -rw-r--r-- 1 root root 17 7月24日 2000 host.conf -rw-r--r-- 1 root root 658 11月16日 2007 initlog.conf -rw-r--r-- 1 root root 0 3月20日 2008 krb5.conf (以下省略)
同じディレクトリで今度は「host*」と指定してみると…
# ls -l host* -rw-r--r-- 1 root root 17 7月24日 2000 host.conf -rw-r--r-- 1 root root 161 6月 3日 13:32 hosts -rw-r--r-- 1 root root 161 1月13日 2000 hosts.allow -rw-r--r-- 1 root root 347 1月13日 2000 hosts.deny -rw-r--r-- 1 root root 163 3月20日 2008 hosts~
ほら。よく我々が「なんだかよく分からないもの」とか「ハッキリと覚えていないもの」を言うときに、「ナントカカントカ」って言葉を使うじゃない?このワイルドカードの「*」とはまさにその「ナントカカントカ」を言う…と覚えてもらうと割と直感的に分かりやすいんじゃないかと思う。
最初の例だと口に出して発音するまんまの記述をすると「ナントカカントカ・ドット・コンフ」だし、後者の例だと「ホスト・ナントカカントカ」ということを表現している訳。
なお、「*」は何も無いも一致する。例えば、「hosts*」と指定したとする。(さっきはhost*だった)この場合…
# ls -l hosts* -rw-r--r-- 1 root root 161 6月 3日 13:32 hosts -rw-r--r-- 1 root root 161 1月13日 2000 hosts.allow -rw-r--r-- 1 root root 347 1月13日 2000 hosts.deny -rw-r--r-- 1 root root 163 3月20日 2008 hosts~
「hosts」という文字列の後ろに何かがくっついているファイル名(なにがくっついていても良い)、「hosts.allow」とか「hosts.deny」とか「hosts~」とかが引っかかっているが、これと同時に「hosts」という文字列の後ろに何も無い、「hosts」そのものも引っかかっていることが判る。これは要するに、「*」が何でもよいという意味を持つのと同時に、無くても良いという意味を持っているからの他ならないのである。
さて。この「*」は、ファイルやディレクトリの名前の先頭や末尾で使えるだけでなく、名前の中間に位置していても一向に構わない。
ほどよく長くてほどよく面倒くさいファイル名やディレクトリを指定するときにも結構イケたりする。
例えば、「/etc/sysconfig」ディレクトリの中に…
-rw-r--r-- 1 root root 47 5月17日 18:17 network drwxr-xr-x 2 root root 4096 5月17日 18:11 network-scripts/ drwxr-xr-x 4 root root 4096 3月20日 2008 networking/ -rw-r--r-- 1 root root 48 3月20日 2008 network~
「network-script」というディレクトリや、「networking」というディレクトリがある。bashを愛用している人は、TABキーを押してファイル名・ディレクトリ名の自動補完機能を愛用している人も多いと思うが、大抵そんなケースでは最初の2~3文字を入力してTABキーを押していると思う。が、この場合は8文字も入力しないと補完が効かないのである。いやらしいディレクトリ名である。(ま、滅多にこんなとここないけどなー)
ところが、こういう場合にはワイルドカードの方が便利だったりする。
# pwd /etc/sysconfig # cd n*s # pwd /etc/sysconfig/network-scripts
ワイルドカードを使えばたった3文字「n*s」と記述するだけで「network-scripts」ディレクトリであることを指定できているのである。(笑)これをTABキーを使ったファイル名の補完機能を使うというのなら、「network-」まで入力しなければならない。ワイルドカードさまさまなのである。(笑)
もっと凶悪な例でいくと、例えば「/usr/local/apache2/conf」というディレクトリがあったとして、そのディレクトリの内容をlsしたい…(cdでもいいけど)とする。なんと、こんな事がまかり通ってしまうのである。
# cd / # pwd / # ls -la /usr/*/*/conf 合計 72 drwxr-xr-x 4 root root 4096 9月21日 01:24 ./ drwxr-xr-x 15 root root 4096 5月17日 20:43 ../ drwxr-xr-x 2 root root 4096 9月21日 01:20 extra/ -rw-r--r-- 1 root root 2083 9月21日 01:24 httpd.conf -rw-r--r-- 1 root root 1605 9月21日 01:18 httpd.conf~ -rw-r--r-- 1 root root 12958 5月17日 20:42 magic -rw-r--r-- 1 root root 29430 5月17日 20:42 mime.types drwxr-xr-x 3 root root 4096 5月17日 20:42 original/
手抜きの極致である。(笑)
他に、ワイルドカードの代表的な例としては「?」(クエスチョンマーク)がある。これは何か1文字という意味になる。これは、何でもいいけど何か1文字は必要という意味になる。また、これと同じくらい(かそれよりももうちょっと)便利なのが、「[」と「]」(角カッコ)で特定の文字を囲むものである。
例えば。/devディレクトリの中に、ハードディスク等様々なデバイスファイルが配置されているが、これをいろいろなワイルドカードを使用してlsコマンドの結果を確認してみると…
① 「sd*」とした場合
# ls -l sd* brw-r----- 1 root disk 8, 0 10月19日 21:09 sda brw-r----- 1 root disk 8, 1 10月19日 12:09 sda1 brw-r----- 1 root disk 8, 2 10月19日 12:09 sda2 brw-r----- 1 root disk 8, 16 10月19日 21:09 sdb brw-r----- 1 root disk 8, 17 10月19日 21:09 sdb1 brw-r----- 1 root disk 8, 32 10月19日 21:09 sdc brw-r----- 1 root disk 8, 33 10月19日 21:09 sdc1 brw-r----- 1 root disk 8, 34 10月19日 12:09 sdc2 (以下省略)
ハードディスクそのものを表す、「sda」「sdb」というデバイス名と、そのディスクの中に作成されたパーティションを表す、「sda1」「sda2」といったデバイス名と両方が表示されている。
② 「sd?」とした場合
# ls -l sd? brw-r----- 1 root disk 8, 0 10月19日 21:09 sda brw-r----- 1 root disk 8, 16 10月19日 21:09 sdb brw-r----- 1 root disk 8, 32 10月19日 21:09 sdc brw-r----- 1 root disk 8, 48 10月19日 21:09 sdd brw-r----- 1 root disk 8, 64 10月19日 21:09 sde brw-r----- 1 root disk 8, 80 10月19日 21:09 sdf
今度は、「sd」という文字に続けて何か1文字という指定だが、4文字以上のファイルは引っかかってこない。よって、「sda」「sdb」は条件に一致するので表示されるが、「sda1」「sda2」といったデバイスファイル名はここには表示されない。
で、これと同じくらい(かこれよりもうちょっと)便利な指定方法がある。例えば、「sdd1とsde1とsdf1とsdg1だけ表示したいんだけどー」という場合。こういったケースに先ほどの「[」「]」(角カッコ)を使用する。
「sd[defg]1」と、記述するのである。こうすると、角カッコで囲まれた部分は、その中の文字のいずれか1個に一致することが求められる。当然、どれか1文字は必ず必要だし、そこに含まれない文字は一致しないのである。lsコマンドで①や②と同じように実験してみよう。
③ 「sd[defg]」と指定した場合
# ls -l sd[defg] brw-r----- 1 root disk 8, 48 10月19日 21:09 sdd brw-r----- 1 root disk 8, 64 10月19日 21:09 sde brw-r----- 1 root disk 8, 80 10月19日 21:09 sdf brw-r----- 1 root disk 8, 96 10月19日 12:09 sdg
見事にsdd、sde、sdf、sdgの4個だけが表示されている。「sd[defg]1」と指定したならこうなる。
# ls -l sd[defg]1 brw-r----- 1 root disk 8, 49 10月19日 21:09 sdd1 brw-r----- 1 root disk 8, 65 10月19日 21:09 sde1 brw-r----- 1 root disk 8, 81 10月19日 21:09 sdf1 brw-r----- 1 root disk 8, 97 10月19日 12:09 sdg1
「ふ~ん。じゃあ、aとbとcとdとeとfとgとhとiとjとkとlとmとnとを表示したい場合には、sd[abcdefghijklmn]って書く訳?」
と、ヒネた質問をしたくなってウズウズする人も出そうなので、答えておく。連続した文字の範囲を指定する場合は、省略する記述方法がある。この質問のようにaからnまでというケースでは…「sd[a-n]」というように、「-」(ハイフン)を使う。こうすると、aからnまでいちいち記述しなくてもよくなる。なお、組み合わせての指定も出来るので、
「ふ~ん。じゃあ、aとbとcとdとwとxとyとzとを表示したい場合には?」
こんなさらにヒネくれた場合には「sd[a-dw-z]」と、すれば解決なのである。どうだ参ったか。(笑)
ワイルドカードは見てもらったとおり、難しく考えなければ実はそんなに難しい代物ではないことが判ってもらえただろうか。
しかしながら、便利であるが故に危険性も少なくない特にcpコマンドやrmコマンドなどでファイルを操作する際に使用するケースなどでは、意図していなかったファイルを誤って消した・コピーした・移動したなどということが往々にして起こりうるのである。特に「*」(アスタリスク)は要注意である。うっかりどこかのディレクトリのファイルを全部…みたいなことがあり得るからね…orz
まあ、気を付けてもらいつつ、いろいろ試してみてもらいたい。ワイルドカードはなれてしまえば非常に便利なので、これを使わないというのはとってももったいないからね。
コメント 0