ワイルドカードの使い方

広告

コマンドの中には「COPY」コマンドなどのようにファイル名などの引数を取るものも存在します。

例としてあるディレクトリに「ab.html」「c.html」「aaa.html」という3つのファイルが含まれており、これらのファイルを「d:¥back」ディレクトリにコピーするには次のように3回「COPY」コマンドを実行する必要があります。

copy ab.html d:¥back
copy c.html d:¥back
copy aaa.html d:¥back

3つのファイルならばこのように1つ1つコマンドを実行しても大丈夫ですが、もしファイルが100個もあった場合には大変です。このような場合にワイルドカードを使用すると便利です。

ワイルドカードは任意の文字を表す特殊な文字のことで、条件に一致する複数のファイルをまとめて指定する場合に使用されます。ワイルドカードには次の二つの文字が用意されています。

*   任意の長さの文字(0文字以上)
?   任意の1文字(0文字も可)

実際の使い方から見ていくと分かりやすいので、先ほどのファイルコピーをワイルドカードを使って書き直してみます。3つのファイルをコピーするにはワイルドカードを使えば次のように記述することができます。

copy *.html d:¥back

先ほどは3つのファイルを1回ずつに分けてコピーする必要がありましたが、ワイルドカードを使えば1回のコマンド実行で3つのファイルコピーを行うことが可能になります。

ワイルドカードの仕組み

ではどのように実行されているのかを確認します。

まずファイル名を記述するところにワイルドカードが記述されていた場合、その条件に一致するファイルが存在するかどうかが検索されます。例えば「*.html」と書かれていた場合、ワイルドカードの「*」は任意の長さの文字列を表しますので、「*.html」に一致するファイル名とは「任意の長さの文字列」の後に「.html」が続くファイル名のことになります。

実際にどのようなファイル名が「*.html」に一致するのかは次の例を見て下さい。

a.html
index.html
helloworld.html

これらはいずれも任意の文字列の後に「.html」が付くファイル名です。逆にどのようなファイル名が「*.html」に一致しないのかは次の例を見て下さい。

a.txt
index.htm

これらはファイル名の最後が「.html」で終わっていませんので一致しません。

今回の例ではカレントディレクトリの中に「ab.html」「c.html」「aaa.html」の3つのファイルが含まれていることになっています。そこで「copy *.html d:¥back」というコマンドが実行されると、「*.html」に一致するファイルがないかどうか検索が行われ、まず「ab.html」というファイルが一致することが分かります。

一致するファイルが見つかった場合、見つかったファイル名に置き換えてコマンドが実行されます。つまり次のように実行されます。

copy ab.html d:¥back

そしてこれで終わりではありません。ワイルドカードは次に一致するファイルがないかどうかを続けて検索し、見つかった場合は同じようにコマンドを実行します。今回の場合には「ab.html」の他に「c.html」や「aaa.html」も一致しますので、続けて次のようにコマンドが実行されます。

copy c.html d:¥back
copy aaa.html d:¥back

このようにワイルドカードを使ってファイル名を指定することで、条件に一致する全てのファイルに対して同じコマンド実行を行わせることができます。

「*」と「?」

「*」は0文字以上の任意の文字列です。先ほどのように「*.html」と記述すれば「任意の長さの文字列」+「.html」というファイル名に一致します。また「*tokyo*」と記述すれば「ファイル名のどこかに「tokyo」という文字列が含まれるファイル名に一致します。

tokyo.txt
tokyosales.doc
2010tokyoshop.html

もう一つのワイルドカードである「?」は任意の1文字に一致するワイルドカードです。例えば「report??.txt」と記述した場合、どのようなファイルに一致するのかは次を見て下さい。

○  report10.txt
○  reportGV.txt
×  reportP85.txt
×  reportE4.html

「report??.txt」に一致するファイル名は「report」+「任意の1文字」+「任意の1文字」+「.txt」に一致するファイル名です。1番目と2番目のファイル名は一致しますが3番目名のファイルは「report」+3文字+「.txt」となっているので一致しません。4番目のファイル名は「report」+2文字+「.html」となっているので一致しません。

このように「?」の場合は文字の数を絞って一致するファイル名を指定したい場合に便利です。

なおコマンドプロンプトの「?」は0文字についても一致します。先ほどの例で言えば次のようなファイル名にも一致します。

reportR.txt
report.txt

1番目のファイル名は「report」+1文字+「.txt」であり1つの「任意の1文字」に一致する部分がありません。ただ「任意の1文字」は0文字にも一致するためこのファイル名は一致することになります。2番目のファイル名は2つの「任意の1文字」がどちらも0文字に一致した場合の例です。コマンドプロンプト以外だとワイルドカードの「?」は0文字に対応していない場合もありますので注意して下さい。

サンプル

では実際に試してみます。カレントディレクトリに次のようにファイルが格納されているとします。

p7-1

「?.txt」に一致するファイルを「d:¥test¥back」ディレクトリにコピーしてみます。次のように実行します。

copy ?.txt d:¥test¥back

p7-2

「?.txt」に一致する3つのファイルがコピーされたことが確認できます。

次に拡張子が「.txt」のファイルを全て「d:¥test¥back」ディレクトリにコピーしてみます。次のように実行します。(事前に先ほどコピーしたファイルを「back」ディレクトリからいったん削除してあります)。

copy *.txt d:¥test¥back

p7-3

「*.txt」に一致する5つのファイルがコピーされたことが確認できます。

ワイルドカードはこのように便利な反面、間違った使い方をすると思わぬ結果を招くことがあります。ワイルドカードがどのファイル名に一致するのかをよく考えて使うようにして下さい。

( Written by Tatsuo Ikura )