PR

 今回はワイルドカードで特定の種類のファイルだけを抜き出してコピーするプログラムを作ってみます。ワイルドカードの指定を使えば「*.doc」と書いてWordのファイル全般を抜き出すことができます。

 例えば、新しいパソコンを買って、特定のデータだけを移行しようと思った時や、1つのフォルダーにファイルをたくさん入れすぎたので、特定のファイルだけを移したいと思った時、また、マイドキュメント以下のサブフォルダー全てから抜き出したい時など、手作業での分類が面倒なときに、プログラミングをすることで、ササっと処理を行うことができます。

ワイルドカードでコピーするプログラム

【使い方】

 では、今回のプログラムから紹介します。このプログラムは、マイドキュメント以下にある全てのWord/Excel/PowerPointのファイルを一気に、コピー先に指定したDドライブのbackupフォルダーにコピーするというプログラムです。

 20行とちょっと長いのですが、それはコピーするとき、ファイル名が重複しても問題なくコピーできる処理を作ったからです。このプログラムでは、もし、フォルダー以下に重複するファイル名があれば、書類-1.doc。書類-2.docと連番をつけてコピーします。

 以下のプログラムを、なでしこエディタに貼り付けて、プログラムを実行します。すると、マイドキュメント以下にあるコピー対象のファイルを列挙して表示して、コピーしてよいか尋ねられますので、問題なければ[はい]をクリックします。すると、ファイルをコピーします。

【プログラムソース1】

# --- コピーの設定
ワイルドカード=「*.doc;*.xls;*.ppt」#1
コピー元=マイドキュメント #2
コピー先=「d:¥backup¥」 #3
コピー先にフォルダ作成。#4
# --- 列挙と確認
「{コピー元}{ワイルドカード}」の全ファイル列挙して一覧に代入。#5
「以下のファイルをコピーします。{改行}{一覧}」と二択。#6
もし、それがいいえならば、終わり。#7
# --- コピー処理
一覧を反復 #8
  対象からファイル名抽出してファイル名に代入。#9
  保存名=コピー先&ファイル名。#10
  # --- コピー前にファイル名の衝突回避
  もし(保存名が存在する?)ならば #11
    番号=1 #12
    ファイル名から拡張子抽出して拡張子に代入。#13
    ファイル名から「.」まで切り取って基本名に代入。#14
    (保存名が存在)の間 #15
      保存名=「{コピー先}{基本名}-{番号}{拡張子}」。#16
      番号=番号+1 #17
  # -- コピー処理
  母艦のタイトルは対象。#18
  対象を保存名にファイルコピー。#19
# --- 完了通知
「終わりました。」と言う。#20
終わり。#21

図1 Word/Excel/PowerPointのファイルをコピー対象として列挙します

※コピー対象のファイルが多すぎると、ファイルの列挙に時間がかかります。その場合、以下のカスタマイズ方法を見ながら、1行目のワイルドカードを変更したり、コピー元をマイドキュメント以下の特定のフォルダーに限定したりするなど必要最低限の条件を指定することで、実行時間を減らすことができます。

【カスタマイズ方法】

・1行目のワイルドカードを変更することで、ファイルを抜き出す条件を指定できます。セミコロン「;」で区切って複数のワイルドカードを指定することができます。

・2行目でコピー元のパス(どのフォルダをコピーするか)を、3行目でコピー先(どこのフォルダへコピーするか)を指定します。パスの最後は必ず「\」記号で終わるようにします。

例:「マイドキュメント」の下にある「請求書」というフォルダーをコピー元にする場合

  コピー元=「{マイドキュメント}請求書\」

ワイルドカードについて

 「ワイルドカード」という専門用語で見ると、難しいもののように感じますが、既に本連載では、何度かワイルドカードを使ったプログラムを作っています。

 例えば、「ファイルの連続置換に挑戦してみよう!その2(第3回)」では、以下のプログラムを紹介しています。これは、デスクトップ上のアプリケーションのショートカットを列挙するプログラムです。

【プログラムソース2】

「{デスクトップ}*.lnk」のファイル列挙して表示。

 この「*.lnk」などの指定が、ワイルドカードです。ファイルのショートカットの拡張子は「.lnk」なので、「{デスクトップ}*.lnk」と書くと、デスクトップ上にあるショートカット全ての一覧を調べることができます。

 もし、マイドキュメントにある、Wordのファイルを列挙したいなら、Wordファイルの拡張子が「.doc」なので、ワイルドカードで以下のように書くことができます。

【プログラムソース3】

「{マイドキュメント}*.doc」のファイル列挙して表示。

 この、ワイルドカードで特徴的なのがアスタリスク記号「*」です。これは、任意の複数文字列を表します。これと似たもので、「?」で任意の1文字を表すことができます。

 例えば、「a1.txt」「a2.txt」のような連番のファイルがあったとして、数字の1字だけを変更したファイルだけを取り出したい場合、「a?.txt」のように表すことができます。もし、「b100.txt」や「b101.txt」などを取り出す場合は、「a*.txt」や「a???.txt」と書くことができます。

 ちょっと、ワイルドカードの練習をしてみましょう。以下のプログラムを実行すると、デスクトップの「test」というフォルダーに「a1.txt」から「a300.txt」まで、「k1.doc」から「k300.doc」までの連番の無意味なファイルを作成します。

【プログラムソース4】

対象フォルダ=「{デスクトップ}test¥」
対象フォルダにフォルダ作成。
500回
  「{対象フォルダ}a{回数}.txt」へ保存。
  「{対象フォルダ}k{回数}.doc」へ保存。
終わり。

 その上で、ワイルドカードの結果を試すために、以下のプログラムを実行してみてください。これは、「a?0.txt」でファイルを列挙したところです。

【プログラムソース5】

ワイルドカードは「a?0.txt」
対象フォルダは「{デスクトップ}test¥」
「{対象フォルダ}{ワイルドカード}」のファイル列挙して表示。

15_2w1.jpg
図2 ワイルドカードは「a?0.txt」を試したところ

 ワイルドカードの動作を確かめるために、1行目のワイルドカードの内容を「k1?.doc」や「?33.*」などに書き換えて実行してみてください。

ファイルのコピーについて

 次に、ファイルの操作を行う方法を見ていきます。なでしこでファイルやフォルダーをコピーするのは以下のように書きます。

【プログラムソース6】

AをBへファイルコピー

 日本語の意味と命令が一致しているので、覚えやすく使い方を間違えることもないでしょう。この、AやBのところに、ファイルやフォルダーのパスを書きます。このとき、ワイルドカードを指定することもできます。

 例えば、マイドキュメントにあるExcelファイルをデスクトップへコピーするには、以下のように書きます。

【プログラムソース7】

「{マイドキュメント}*.xls」をデスクトップへファイルコピー。

 ただし、この場合、マイドキュメント直下にあるExcelファイルだけがコピーの対象になります。もし、マイドキュメント以下の全てのサブフォルダーを対象にコピーをする場合には、以下のように、「ファイル全列挙」命令と「反復」構文を組み合わせます。

【プログラムソース8】

「{マイドキュメント}*.xls」の全ファイル列挙。
反復
  対象からファイル名抽出してファイル名に代入。
  対象を「{デスクトップ}{ファイル名}」へファイルコピー。
「完了」と言う。
終わり。

 ※ただし、このプログラムでは、重複するファイル名があったとき、上書きコピーしてしまいます。重複しないようにするには、冒頭のプログラムのように、ファイル名に番号をつけるなどの工夫が必要になります。

 同様にして、ファイルやフォルダーを移動するには「AをBへファイル移動」と書きます。削除する場合は、「Aをファイル削除」と書きます。

まとめ

 今回は、ワイルドカードの使い方を中心にして、ファイルのコピー方法を解説しました。ワイルドカードは非常に便利です。もちろん、なでしこのプログラム以外でも、Excelの置換コマンドや、DOSプロンプト、Linuxのシェルなど、あらゆる場面で同じように使うことができます。

はじめてこの連載を読む方へ
 この連載では、日本語でプログラムが書ける「なでしこ」というツールを使って仕事に役立ちそうなプログラムを紹介しています。なでしこのプログラムエディター(なでしこエディタ)に、記事中で紹介しているプログラムソースをコピー・アンド・ペーストし、実行ボタンを押すだけで、プログラムを動作させることができます。詳しい内容は本連載第1回をご覧ください。


【PCオンライン編集部からのお願い】
「なでしこ」は個々のユーザーの責任において利用してください。
コラムで紹介するなでしこのプログラム動作については編集部でも確認していますが、すべてのユーザーのパソコン環境で同じように動作することを保証するものではありません。
申し訳ありませんが、紹介する内容について、個別のご質問にはお答えしかねます。なでしこの公式ページでは詳しいマニュアルや質問を受け付ける掲示板が提供されていますので、そちらをご参照ください。
よろしくお願いいたします。