[PR]

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ren コマンドでワイルドカードを使う場合の注意

コマンドプロンプトに慣れているなら当然のように使っていると思います。いまさら何の説明がいるのかというくらい基本的なものですけど、このコマンドが備えているほんの少しの便利な機能と、それを帳消しにするクソ仕様を知っていますか?

まず便利な機能というのはワイルドカードが使えることです。例えば ren *.txt *.bat と打ってみると拡張子を一括で変更できます。これはいいですね。しかし ren * *.bat と打っても同じ事が起こります。これも便利と思うかもしれませんけど、こういう勝手な自動補完がクソのもとなんです。

C:\hoge>dir /b
1.txt
2.txt
3.txt

C:\hoge>ren *.txt *.bat

C:\hoge>dir /b
1.bat
2.bat
3.bat

C:\hoge>ren * *.txt

C:\hoge>dir /b
1.txt
2.txt
3.txt

C:\hoge>

もちろん一文字のワイルドカードも使えます。例えば ren *.txt ?.txt と打つと先頭一文字だけを残してくれます。二文字なら ren *.txt ??.txt です。

ワイルドカードは便利です。でもクソ仕様の原因もワイルドカードに起因するのです。とりあえず ren *.txt *.a.b と打ってみますと、これは *.a.b になってくれます。ここまではいいです。次に ren *.a.b *.1.2 と打ってみますと *.1.2 にはなってくれません。なぜか *.a.1.2 になってしまいます。

C:\hoge>dir /b
1.txt
2.txt
3.txt

C:\hoge>ren *.txt *.a.b

C:\hoge>dir /b
1.a.b
2.a.b
3.a.b

C:\hoge>ren *.a.b *.1.2

C:\hoge>dir /b
1.a.1.2
2.a.1.2
3.a.1.2

C:\hoge>

基本的にワイルドカードの後ろに付ける文字は拡張子と解釈してしまうようです。ワイルドカード直後にドットがある場合はドットより先が拡張子と解釈されるようで、上の例では *.a.b は a.b が拡張子として txt と置換されています。一方、ワイルドカードの直後に文字がある場合はその文字が拡張子の一部と解釈されるようで、例えば ren test.txt *a.b は test.txta.b になります。 tesa.b にはなりません。

ということはワイルドカードの前に文字を付けたら先頭に文字を付加してくれるのかというと、そんなことはなく普通に置換してくれるので、結果として感覚的な統一性を欠いた処理になります。つまり ren test.txt *a と打つと test.txta にしちゃうのに ren test.txt a* と打つと aest.txt にしやがります。あ゛ー!ってなります。

C:\hoge>dir /b
test1.txt
test2.txt

C:\hoge>ren test1.txt a*

C:\hoge>ren test2.txt *a

C:\hoge>dir /b
aest1.txt
test2.txta

C:\hoge>

拡張子を変に分けないで素直に全体をファイル名として扱えば何の問題もなさそうなのに。ドットファイルとかまともに扱えるのかしら。まあ普通は Windows では扱いませんけど。

微妙な便利さがうまく使えそうだと思って調べると、大抵やっぱり使えません。いろいろ試してムキー!ってなればいいと思います。

スポンサーサイト

コマンドラインで連番ファイル名の変更 (2)

の続きです。

実は ren コマンドはそのおせっかい仕様の把握さえできていれば for なんて使わなくても連番ファイルを一括リネームができる力を持っているかもしれません。できることがなくはないです。条件さえ揃えば。たまには。

イライラ仕様は過去記事を参照してもらうとして、例えば test*.txt というファイルを hoge*.txt にリネームしたい場合は ren test* hoge* でできます。簡単すぎて for なんて使うのはバカみたいです。ですが、これは test と hoge の文字数が同じだからできるのです。試しに ren test* a* とか ren test* sample* とかやってあ゛ー!ってなれ。

C:\hoge>dir /b
test1.txt
test2.txt
test3.txt

C:\hoge>ren test* hoge*

C:\hoge>dir /b
hoge1.txt
hoge2.txt
hoge3.txt

C:\hoge>ren hoge* a*

C:\hoge>dir /b
aoge1.txt
aoge2.txt
aoge3.txt

C:\hoge>ren aoge* sample*
重複するファイル名が存在するか、またはファイルが
見つかりませんでした。
重複するファイル名が存在するか、またはファイルが
見つかりませんでした。

C:\hoge>dir /b
aoge2.txt
aoge3.txt
sample.txt

C:\hoge>

一応 for コマンドでは問題になった連番の桁に左右されないというメリットがあります。例えば test0001.txt から test1000.txt でも ren test* hoge* でできます。

それで、ここまでやっておいてですけど実は PowerShell を使えばすべて解決します。というわけでに続きます。

Sponsored Link
Information
Menu
アンケート
Links
Mail Form

名前:
メール:
件名:
本文:

Sponsored Links
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。