Linuxシェルは毎日の生活になっているので普通に使ってたけど、ここにきて仕事でWindowsバッチを書くことが多くなった。両方で同じことをしたい。
今いるフォルダの一覧を取得する(lsと同じ)を、bashとWindowsバッチと両方でやってみる。
$ for i in *; do echo "$i"; done
② Windows バッチの場合(ls.bat)
for /F %i in ('dir /b') do @echo %i
バッチの中で正規表現も使えたりする。
③ Linux
$ for i in *{txt,log,sql}; do echo "$i"; done
④ Windows
for /F %i in ('dir /b ^| findstr /r ".*txt | .*log | .*sql"') do @echo %i
注意点
バッチのdir /b をパイプしてfindstrに渡すときは、パイプの前にキャレット^が必要らしい。しかしfindstr /r の引数にくる文字列の中で(orの意味で)パイプを使うときはキャレットは不要。
サラッと書いて動くのはいいけど、やっぱDOSバッチには限界がある。PowerShellで書くとさらに面倒で、どうしたってワンライナーって気にはならない。Linux版のPowerShellなんてのも出始めたようだけど、そんなの使うよりはbash使うよね…
おまけ
Windowsで書いたShift-JISなbatファイルをLinuxで開くと文字化けする。Shift-JISをUTF8に変換する一番確実なnkfのオプションは「-wLux」。
$ cat win.bat | nkf -wLux
-w UTF8にする
-Lu 改行をLinuxのもの(LF)に統一する
-x 半角カナを半角カナのままにする。