WindowsでもLinuxコマンドが動く
こんにちは! 皆さんはWindowsで開発をしているとき、「あ、ここで grep や find が使えたら楽なのに…」と思ったことはありませんか?
WSL(Windows Subsystem for Linux)の登場でWindows上でのLinux環境は劇的に良くなりましたが、Windows側のPowerShellやコマンドプロンプト(CMD)で作業しているとき、ふとLinuxの癖で ls -la や cat を叩いてエラーになり、ストレスを感じることはエンジニアあるあるだと思います。
そんな悩みを根本から解決するツールがついに一般提供(GA)されました!
今回は、このMicrosoftが出した「Coreutils for Windows」がエンジニアにもたらすメリットや、インストール方法、そして「これまでとこれから」の具体的な変化についてご紹介します。
1. 「Coreutils for Windows」とは?
Coreutils for Windowsは、LinuxやmacOSでお馴染みのUNIXスタイル互換のコマンドラインユーティリティを、Windows上でネイティブに実行できるようにしたパッケージです。
中身は、GNUのCoreutilsをRust言語で安全・高速に再実装しているオープンソースプロジェクト「uutils/coreutils」をベースに、findutils(find や xargs)やGNU互換の grep を加え、Microsoftが1つのパッケージ(マルチコールバイナリ)としてビルド・メンテしているものです。
エンジニアが得られる最大のメリット 文脈切り替え(コンテキストスイッチ)のコスト削減: Mac、Linux、WSL、コンテナ、クラウド環境(AWS/Azure等)を行き来する際、Windowsだけ「PowerShell用のコマンドや引数」に頭を切り替える必要がなくなります。
WSLを起動しなくても爆速で動く: Windowsネイティブで動作するため、WSLのLinuxファイルシステムとWindowsファイルシステム間のファイル移動やオーバーヘッドを気にせず、Windows側のローカルファイルをサクッと処理できます。
既存の「シェル芸」やスクリプトがそのまま使える: ネットに転がっているLinux向けのテキスト処理のワンライナー(find + xargs + grep など)をそのままコピー&ペーストして実行できます。
2. これまで vs これから(具体的なユースケース)
Coreutils for Windowsを導入することで、日々のコマンド操作がどのように変わるのか、具体例を見てみましょう。
例1:ファイルの一覧を詳細表示したい時(ls)
これまで:
PowerShellで ls -la と打つと、エラー(パラメーター 'la' が見つかりません)になります。PowerShellの ls は Get-ChildItem のエイリアスに過ぎないため、Linuxのオプションが通らないのです。
これから:
GNU互換の本物の ls が動くため、ls -la や ls -lh がそのまま使え、見慣れたリスト形式でファイルが表示されます。
例2:ログファイルから特定の文字列を検索したい時(grep)
これまで:
PowerShell独自の Select-String を使う(構文やオプションをググり直す)、あるいはわざわざ wsl grep "ERROR" app.log のようにWSLを経由して呼び出していました。
これから:
PowerShellやCMDから直接、馴染みのある grep -i "error" *.log がネイティブの速度で実行できます。
例3:特定のファイルを検索して一括削除したい時(find + xargs)
これまで:
Get-ChildItem -Recurse -Filter *.tmp | Remove-Itemという、PowerShell特有の長いパイプライン構文を書く必要がありました。
これから: Linuxエンジニアなら三度の飯より使っている(?)あのワンライナーがそのまま動きます。
find . -name "*.tmp" | xargs rm3. インストール方法
インストールは非常に簡単です。Windows標準のパッケージマネージャー「WinGet」を使って、コマンド一発で導入できます。
PowerShell(推奨:PowerShell 7.4以降)またはコマンドプロンプトを開き、以下のコマンドを実行します。
winget install Microsoft.Coreutils※手動でインストールしたい場合は、GitHubのmicrosoft/coreutilsリポジトリのリリースページからインストーラー(.exe)をダウンロードすることも可能です。
4. エンジニアが導入時に知っておくべき注意点
非常に便利なツールですが、実務で使う上でいくつか押さえておきたいポイント(注意点)があります。
PowerShellの組み込み「エイリアス」との衝突
PowerShellでは、すでに ls や cat、cp、mv、rm などが、PowerShell内部のコマンド(Get-ChildItem や Get-Content など)のエイリアスとして登録されています。 そのため、インストールしただけではPowerShellのエイリアスが優先されてしまい、Coreutils版のコマンドが呼ばれないケースがあります。
対策: Coreutils側の挙動を優先させたい場合は、PowerShellのプロファイル($PROFILE)などでエイリアスを削除するか、環境変数 PATH の優先順位を調整する必要があります。 (例:Remove-Item alias:ls などをプロファイルに記述する)
DOSコマンドとの競合回避
Windowsの歴史的なコマンドである dir や more など、衝突すると既存のバッチファイル(.bat)などを破壊しかねないコマンドは、このパッケージには意図的に含まれていません。
Windowsならではの挙動(改行コードやパス区切り)
パス区切り文字は / と \ の両方を賢く解釈してくれます。
ただし、Windowsのテキストファイルは改行コードが CRLF (\r\n) であることが多いため、$ を使った正規表現の末尾マッチングなどで意図しない挙動になることがあります。また、Windowsのアクセス権限(ACL)はPOSIXのパーミッションとは異なるため、find -perm などの一部機能は制限されます。
まとめ:Windowsがさらに「開発しやすいOS」へ
今回登場した「Coreutils for Windows」は、WSLやDev Drive、Sudo for Windowsに続き、Microsoftが本気で「Windowsを最高の開発環境にする」という意思を感じる素晴らしいアップデートです。
環境ごとの「コマンドの書き換え」という、地味ながら脳のリソースを削られる作業から解放されるメリットは想像以上に大きいです。
WinGetで簡単に試せますので、インフラエンジニア、Webエンジニア、データサイエンティストの皆さんはぜひ手元のWindows環境に導入して、その快適さを体感してみてください!
参照リンク:GitHub - microsoft/coreutils