SSブログ

Linux再入門・その2:ワイルドカードは怖いけど怖くない [Linux再入門]

 Linuxをさわりたての人にとっては、正規表現・ワイルドカードというものにはたいそう抵抗感を覚えるそうで、なかなか飲み込めない・活用できないものらしい。まあ、正規表現もワイルドカードも、突き詰めていくと本が1冊かけてしまうくらい奥が深いものなので、こんなちっぽけな場末のblogじゃどうしようもないのだけども、そこまで肩肘張らずにもっと簡単に考えれば割とイージーで便利なものなんだけどねえ。



 ワイルドカードとして、とにかく頻繁に使われる物として「*」(アスタリスク)がある。(見やすさを優先するため、ここでは全角のアスタリスクを使ったが、実際には半角のアスタリスクであることは言うまでもない。なお、コマンドの投入例には正規の(半角の)アスタリスクやその他の記号を用いるが、読みづらいと思うので、適宜メモ帳等にコピー&ペーストしてもらって内容を確認してもらうと良いだろう

 アスタリスクは「何でも良い」という意味がある。(笑)
 たとえば、「*.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



 まあ、気を付けてもらいつつ、いろいろ試してみてもらいたい。ワイルドカードはなれてしまえば非常に便利なので、これを使わないというのはとってももったいないからね。
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。