【Windows】ファイル名変更でワイルドカードを使うと失敗する原因【コマンドプロンプト】
今回はWindowsのコマンドプロンプトでmoveコマンドやファイル名を変更する際、renコマンドでワイルドカードの「*」を使うと、エラーが出たり、想定と違うファイル名になってしまう事象の再現と原因・対策方法を紹介していきます。
変更したファイル名がおかしい?
作業イメージ
今回は以下のような「夕会議事録」から始まるファイル名のテキストファイルを「夕会メモ」というファイル名に変更したいと思います。(実際には夕会議事録31.txtまであります。)
作業イメージをサクラエディタで表現してみると「文字列の置換」と同様の操作になります。
使用したファイル名変更コマンド
そのために以下のコマンドを使ってファイル名を変更しました。
ren 夕会議事録* 夕会メモ*
ファイル名に「夕会議事録」を含むファイルから「夕会議事録」を「夕会メモ」に変更することを想定したコマンドです。
コマンド実行結果
上記のコマンドをコマンドを実行してみると、、、
ん?「夕会メモ録」ってなんやねん。。。
ファイル名をもどして、moveコマンドで実施してみます。
move 夕会議事録* 夕会メモ*
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
エラーが出て実行できませんでした。
このように、想定していたファイル名になりません。
ファイル名が変になる原因
原因を色々調べてみると、どうやらファイル名変更部分の文字数が異なっていることが関係しているようです。
今回のようなrenコマンドでファイル名を変更すると、まず「夕会議事録*」を使って対象ファイルを探しますが、「夕会議事録」という文字列が「*」の前の文字として扱われ、「夕会議事録1.txt」~「夕会議事録31.txt」が対象のファイルであることを認識します。
次に「夕会メモ*」を使ってファイル名を変更していくのですが、「夕会議事録」という文字列を「夕会メモ」という文字列に置き換えるわけではないようです。
実際には「夕会メモ」という4文字分を書き換えて、以降は元のファイル名をそのまま使っています。
そのため、元のファイル名より多い文字数を書き換えた場合は、元のファイル名がすべて書き換えられてしまい数字の部分も無くなってしまいます。
※「.txt」は拡張子のため、書き換えの対象外です。
文字数に影響されないようにファイル名を一括で変更する方法
ワイルドカードでのファイル名変更は変更する文字数に差異があると想定通りにならないので、他の方法で一括変更します。
forコマンドを使ってループ処理でファイル名を変更
どうしてもコマンド一発で一括変更したい場合はこの方法があると思います。
実際に使用するコマンドとしては以下の様になります。
for /l %i in (1,1,31) do ren "夕会議事録%i.txt" "夕会メモ%i.txt"
コマンド説明
for /l %i in (1,1,31) do
この部分はループをするコマンドです。
そのループ中に1~31までを1づつ増やしながら変数「i」に代入しています。
ren “夕会議事録%i.txt" “夕会メモ%i.txt"
代入した数字が入っている変数iを使って「夕会議事録i.txt」の各ファイルを「夕会メモi.txt」に変えています。
ループ一周目では変数「i」の中に「1」が入っているので「夕会議事録1.txt」を「夕会メモ1.txt」に変更しています。
それを31回ループ
31周目では変数「i」の中に「31」が入っているので「夕会議事録31.txt」を「夕会メモ31.txt」に変更し、ループを終了します。
以上で、ファイル名を変更する中でワイルドカードを使うとエラーが出たり、変なファイル名になる原因と対処方法の紹介でした。
ディスカッション
コメント一覧
まだ、コメントがありません