WindowsでのRubyワンライナーの注意点
Windowsのコマンドプロンプトで、連番リネーム用に下のように書いて軽くハマった。
ruby -e 'Dir.glob("*.bmp").each_with_index {|f,i| File.rename(f, "hogehoge" + (i+1).to_s + ".bmp")}'
'f' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
結論からいえば、シングルクォートがまずくてcmd.exeがパイプに反応してたんだけど、ネットで調べてたら良いページが見つかって、そこに注意点が列挙されてたのでメモ。
- Windowsのコマンドプロンプト上で
ruby -e
オプションの引数に与えるコード片はダブルクォートで囲む - 上記でダブルクォートを使用するので、文字列リテラルはシングルクォートで囲むことになる
- ただし、バックスラッシュ記法と式展開を使いたい場合は、%記法で記述する
ちょっとめんどくさいけど、普段からMac/Linuxとかでも上記のルールを守っておけば、Windowsの時にハマらなくて済みそう。 ということで、冒頭で書いたワンライナーはこんな感じに修正。
ruby -e "Dir.glob('*.bmp').each_with_index {|f,i| File.rename(f, 'hogehoge' + (i+1).to_s + '.bmp')}"