甘くも危険なワイルドカードを使いこなす:マウスのいらないコマンドプロンプトの世界
同じようなファイル名で一部が違っているような場合、これらのファイルを一度に操作したいことはないだろうか。実は、ワイルドカード文字を使うと一度に処理できることがある。ただ、使い方を間違えると大変なことになることも……。
そんなあいまいな条件でファイルを探せって?
ファイル名があいまいだったり、同じようなファイル名で一部が違っていたりする場合、これらのファイルを検索、操作する際にワイルドカード文字を使うと一度に処理できることがある。ただ、思ったように使えないことも……。何で不思議なことになるのか、ワイルドカードの使い方を紹介しよう。
大量のファイルの中から特定パターンを持つファイル名だけを指定する強い味方
Microsoft WordやMicrosoft Excelを使っていて、[ファイル名を付けて保存]とか、既存のファイルを[開く]といった作業を行うときに、[保存]や[開く]ダイアログが表示されるが、そのとき気になる表示がある。
[ファイルを開く]ダイアログなどにある「*」ってどんな意味
Microsoft WordやMicrosoft Excelでも「*」の文字を見かけることがある。この画面でユーザーが直接「*」を指定することはないのだが、この「*」の意味って何?
このダイアログで表示される「*.docx」とか「*.xlsx」の「*」という表記は何か? 知っている人には説明の必要もないが、これはワイルドカード文字(Wildcard Character)というものだ。世界中で遊ばれている某定番カードゲームに、どの色や数字としても使える超便利な札としてワイルドカードが含まれているが、Windows OSのワイルドカード文字も、あれに負けず劣らず便利なものだ(ただし使い方を間違えなければの話)。
【今回のミッション】
上司がまた、とんでもない難題を持ちかけてきた。
「緊急事態だ。先ほど、部長から『昨年の会議で君に頼んでおいた例の件どうなっている?』と聞かれて『バッチリです』と即答してしまったんだが、頼まれた件が何だったか思い出せないんだよ。そもそも何の会議だったのだか……。部長が出席していたから、定例部会やチームミーティングではないはず。いつ頃かも、よく覚えてないんだよなぁ。確か昨年の、10日とか20日とか30日とか切りのいい日付だった気がするんだが……。とにかく該当する会議の議事録を探してよ」
なぜ、その場で「何の件だったのか」を部長に聞き返さないのか? 自分は、こんな上司の下で働いていて大丈夫なのかという不安はさておき、問題を整理しよう。
うちの会社の議事録は、Microsoft Wordで記述されていて、ファイル名は必ず「YYMMDD_〇〇〇〇.docx」という形式になっている。YYは西暦の下2桁で「20」や「21」、MMは月で「01」〜「12」、DDは日にちで「01」〜「31」が入る。〇〇〇〇は会議名で「営業会議」「企画会議」「定例部会」「チームMTG」などが入り、ファイル名を見ただけで、いつのどの会議なのかが簡単に分かるようにしてある。例えば、2021年5月1日の企画会議ならば、「210501_企画会議.docx」というファイル名になる。
しかし、几帳面(きちょうめん)なのはそこまでで、サブフォルダは作らず、全て「議事録」フォルダに突っ込まれている。さて、膨大な数のファイルから当該ファイルをピックアップするには、どうする?
このようなファイル名の持ついろいろなパターンを利用して、大量のファイルの中から目的のファイルだけを指定できるのがワイルドカード文字だ。
あいまいなファイル指定を可能にする超便利文字
詳しい説明は後回しにするが、この場合はワイルドカード文字を使うと簡単に作業が完了する。カレントフォルダが「議事録」で、受け渡し用のUSBメモリがD:ドライブに割り当てられているとして、copyを使った次のコマンドを実行すればよい(コマンドの意味は後述)。
copy 20*0_*会議* d:[Enter]
Windows OSではファイルやフォルダを指定する際に、ファイル名やフォルダ名の一部、あるいは全部が明確でなかったり、複数の候補があったりするときに、その部分をあいまいなまま指定できる特殊な代替文字が使える。これがワイルドカード文字だ。ワイルドカード文字には次の2種類がある。
文字 | 意味 |
---|---|
? | 指定した場所の任意の1文字と一致する。文字数が分かっているが文字種が分からないときに、文字数分の置き換えに使うと便利 |
* | 任意の数の任意の文字と一致する。文字数も文字種も定かでないときに使うと便利だが、使い方を間違えると意図したファイルを指定できないので注意 |
ワイルドカード文字の種類と意味 |
例えば、「a?b」と指定すると「atb」や「akb」などに一致する。「a*b」と指定すると「atb」や「akb」はもちろんだが、「ab」「absorb」「accidental flashmob」にも一致する。注意が必要なのは、「?」は指定場所に1文字があるという前提だが、「*」は任意の文字数なので「ab」のように0文字の場合も一致する点だ。
なお、例では半角文字ばかり紹介しているが、ひらがなや漢字といった全角文字にも一致するので、半角英数とかな漢字(全角)のファイル名にも使える。
ワイルドカード文字は、コマンドラインから実行するコマンドの多くで、ファイル名を指定する部分に利用可能だ。例えば、dir、copy、ren、del、find、fcなど、本連載でこれまでに紹介したコマンドでも利用できる。
「exam」で始まる複数のテキストファイルとanswer.txtを比較するなら次のように使う。
fc exam*.txt answer.txt[Enter]
ミッションクリアのためのワイルドカード文字はこれだ!
事前の説明が長くなったが、このワイルドカード文字で今回のミッションを解決していこう。
まず、日付部分(「YYMMDD_」)だけを考えよう。「昨年(2020年)」ということなのでファイル名の先頭は西暦の末尾「20」、月の2桁は不明で、日にちは「10」か「20」か「30」、つまりどのケースでも末尾は「0」ということだ。担当者が日付の後に「_」を入れているので、これを確定している部分として指定する。つまり日付部分は「20???0_」または「20*0_」と指定できる。
「とにかく会議だった」ということで、ファイル名に「〇〇会議」という名称が入っているはずなので、ここは会議名全体が何文字か分からないので「*会議」とする。
拡張子は「.docx」なので、そのまま指定するなら「20*0_*会議.docx」だ。フォルダ内には拡張子「.docx」のファイルしかないという前提で「20*0_*会議*」のように記述すれば、入力文字数が減らせる。カレントフォルダからUSBメモリのD:ドライブにコピーするなら以下のコマンドを実行すればいい。
copy 20*0_*会議* d:[Enter]
悪いのはワイルドカード文字じゃない!? 周囲の環境のせいだ
と、ここまで説明をしておいて大変恐縮だが、実際には前述のような例ばかりでなく、ワイルドカード文字がイメージ通りに一致せず、とんでもない結果を招いてしまうケースも多い。分かりやすい例は次のようなものだ。
フォルダ内に以下の2つのファイルがあったとしよう。
企画会議議事録.doc
営業会議議事録.docx
このときdirコマンドに「*.doc」と指定すると、前述の説明しかなければ「企画会議議事録.doc」のみに一致しそうだが、実際には両方に一致してしまう。
この奇妙な振る舞いには歴史的な背景が絡んでいる。
ワイルドカード文字は、まだ元号が昭和だった昔、Windows OSの前身となる「MS-DOS」で使われていたものが現代に至るまで脈々と受け継がれている。MS-DOSではファイル名の制限が現在より厳しく、ベース名8文字以下、拡張子3文字以下でしか命名が許されなかった。いわゆる「8.3形式」と呼ばれる命名規則だ(さらに、スペースなど幾つかの文字種に使用制限があり、大文字小文字の区別もなかった)。8.3形式のファイル名とは次のようなものだ。
BASENAME.EXT
企画会議.DOC
ひらがなや漢字など全角文字は半角2文字分として扱われるので、日本語ファイル名はかなり厳しいルールであることが分かる。
Windows 10では命名が許されている次のようなファイル名もMS-DOSの時代には許されなかった。
Long and Winding.FileName.Extention
4月1日社員総会における社長訓示について.docx
コマンドプロンプトは、MS-DOS時代の資産が流用できるようにコマンドラインインタフェースを再現したものなので、ワイルドカード文字も原則としてMS-DOS時代と同じ振る舞いをするように実装されている。
ところが、Windows 95以降で長いファイル名が使えるようになってしまったことにより、意図しないファイル名の一致が起きるようになった。原因は、8.3形式に収まらない名前を持つファイルに、Windows OSが勝手に8.3形式の別名を割り当ててしまい、この別名もまたワイルドカード文字の適用対象になってしまうためだ。
このWindows OSが勝手に割り当てる8.3形式の別名は、dirコマンドに/Xオプションを指定すると確認できる。
「*.doc」が拡張子「.docx」のファイルにも一致してしまうのは、拡張子「.docx」が8.3形式で3文字に丸められ、「.doc」となった別名が付けられていたからだ。なお、「*.docx」と指定することで拡張子「.docx」のファイルだけをマッチさせることはできる。
また、ベース名が8文字以上の場合や8.3形式で使えない文字を使用している場合は、ベース名の一部を削除あるいは改変し、「~」に続く連番を追加した合計8文字の別名が勝手に付けられてしまう。
そのためワイルドカード文字でファイル名を指定する際に、指定文字列や対象ファイル名に数字が入るときには注意が必要だ。例えばベース名の終わりが「1」というファイルを選ぶのに「*1.*」のように指定すると、Windows OSが8.3形式で勝手に名付けた「〇〇〇~1.xls」などに一致してしまうことがある。これも意図しない結果を招いてしまう原因だ。こちらについてはワイルドカード文字の使い方で、ある程度回避することも可能だ。
別名のベース名に付けられた数字が一致してしまう
別名の拡張子は3文字以下なので、もとのファイル名に「.docx」や「.xlsx」「.html」のような4文字以上の拡張子を持つなら、そこまで指定することで、別名ではなく長いファイル名に一致させることができる。
以上のようにワイルドカード文字はとても便利なのだが、使い方を間違えると意図しないマッチが起きる可能性もある。
特にファイルのコピーや削除でワイルドカード文字を使うケースでは、間違ったファイルを上書きコピーしたり、必要なファイルを消してしまったりする危険性があるため、細心の注意が必要になる。しかし、これはワイルドカード文字が悪いのではなく(仕様は昔のまま)、周囲の環境(Windows OSのファイルシステム)が時代に合わせて変わってしまったことに原因があるのだ。
実は、Windowsに8.3形式の別名を作らないように設定することもできるのだが、システムの動作に変更を加えるコマンドを使用する必要があるため、ここでは説明しないでおく(気になる方は、少々古い記事ではあるが、Windows TIPS「8.3形式の短いファイル名を生成しないようにするを参照してほしい)。
今回紹介したコマンド
ワイルドカード文字(?、*)、dir、fc
Copyright© Digital Advantage Corp. All Rights Reserved.