min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash Linuxシェルと同じことをWindowsバッチでやる

Linuxシェルは毎日の生活になっているので普通に使ってたけど、ここにきて仕事でWindowsバッチを書くことが多くなった。両方で同じことをしたい。

 

 

 

今いるフォルダの一覧を取得する(lsと同じ)を、bashWindowsバッチと両方でやってみる。

Linux bashの場合(ls.sh)

$ for i in *; do echo "$i"; done

Windows バッチの場合(ls.bat)

for /F %i in ('dir /b') do @echo %i

f:id:min117:20160907230054p:plain

バッチの中で正規表現も使えたりする。

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の意味で)パイプを使うときはキャレットは不要

f:id:min117:20160907231028p:plain

サラッと書いて動くのはいいけど、やっぱ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 半角カナを半角カナのままにする。