WSL(Windows Subsystem for LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネル)環境で作業をしていると、「Linux側のシェルスクリプトからWindows側のファイルやツールを操作したい」「Windowsのパス形式をLinux形式に変換してスクリプトに渡したい」という場面に直面することがあります。しかし、Windowsのパス区切り文字(\)とLinuxのパス区切り文字(/)の違いやドライブレターの表現方法の差異により、パスの指定ミスやエラーに悩まされた経験はないでしょうか。
この記事を読むことで、WSLに標準搭載されている wslpath コマンドを用いたファイルパスの相互変換方法を習得できます。シェルスクリプト内でのパス指定ミスを防ぎ、WindowsとWSLの間でファイルをスムーズに連携させるための実用的なテクニックを確認していきましょう。
確認した環境
本記事で解説するコマンドや手順は、以下の環境で動作を確認しています。
- OSOS [オーエス]Operating System。基本ソフトウェア: Windows 11 Home(ビルド 26200)
- 仮想環境: WSL 2(WSL バージョン 2.3.26.0)
- ディストリビューション: UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04.1 LTS
なお、記事中の username などのユーザー名やパスは説明用に置き換えた例です。コマンドの動作は上記の環境で確認しています。
wslpathコマンドとは?WindowsとLinuxのパス変換が必要な理由
WSL環境(Ubuntuなど)は、内部的にはLinuxのファイルシステム構造を持ちながらも、ホストOSであるWindowsのファイルシステム(Cドライブやネットワークドライブなど)へアクセスする機能を持っています。例えば、Windows側の C:\Users\username\Documents というパスは、WSL内からは /mnt/c/Users/username/Documents として参照可能です(/mnt/c は一般的な既定のマウント構成での例です)。
しかし、Windows用の実行ファイル(.exe)をWSLのシェルから直接呼び出す際や、Windows側のツールにパスを渡す場合、パスの形式が異なるとエラーが発生します。ここで役立つのが wslpath コマンドです。 wslpath を使用することで、人間が手動で書き換えることなく、正確なパス変換を自動化できます。
wslpath コマンドの基本的な構文は以下の通りです。
wslpath [-a] [-u|-w|-m] <パス>オプションを省略した場合は、-u(Windowsパス → WSLパス)が既定の変換方向として使用されます。WSL形式のパスをWindows形式に変換したい場合は、-w または -m を明示してください。変換方向を指定することで、意図しないパス変換を防ぎやすくなります。
WSLからWindowsパスへ変換する方法(-wオプション)
Linux(WSL)形式のパスを、Windows形式のパス(バックスラッシュ区切り、ドライブレター付き)に変換したい場合は、-w オプションを使用します。
例えば、WSL内のホームディレクトリにあるファイルを指定する場合の実行例は以下の通りです。
wslpath -w /home/username/project実行結果の例:
\\wsl.localhost\Ubuntu\home\username\projectこのように、WSL内部のファイルは \\wsl.localhost\<ディストリビューション名>\... という形式のUNCパスに変換されます。/mnt/c などのマウントされたWindowsドライブを指定した場合は、より直感的なドライブレター形式に変換されます。出力例の Ubuntu はディストリビューション名です。実際に使っている名前に読み替えてください。
wslpath -w /mnt/c/Users/username/Documents実行結果の例:
C:\Users\username\DocumentsWindowsからWSLパスへ変換する方法(-uオプション)
逆に、Windows形式のパスやエクスプローラーからコピーしたパスを、WSLで使用できるLinux形式のパスに変換したい場合は、-u オプションを使用します。
Windowsのパスを指定する際は、バックスラッシュ(\)がシェルのエスケープ文字として解釈されないよう、シングルクォーテーションで囲むか、スラッシュ(/)に置き換えて指定します。
wslpath -u 'C:\Users\username\Documents'実行結果の例:
/mnt/c/Users/username/Documentsまた、WSL内部の領域を指すUNCパス(\\wsl.localhost\...)も変換できます。これにより、Windows側のアプリケーションから渡されたパスを、WSL内のスクリプトで正しく処理できるようになります。
UNC_PATH="\\\\wsl.localhost\\${WSL_DISTRO_NAME}\\home"printf '%s\n' "$UNC_PATH"wslpath -u "$UNC_PATH"実行結果の例:
\\wsl.localhost\Ubuntu\home/home$WSL_DISTRO_NAME は、現在実行中のディストリビューション名が入っているWSLの環境変数です(例: Ubuntu)。wslpath -u で変換できるUNCパスは、今いるディストリビューション自身を指すものだけです。別のディストリビューション名(例: Ubuntu で実行中に \\wsl.localhost\Ubuntu-20.04\home を指定)を渡すと、wslpath: \\wsl.localhost\... というエラーになります。ディストリビューション名やパスの構成によって結果が異なるため、実際の環境で変換結果を確認してください。上記の例は WSL_DISTRO_NAME が設定されていることを前提としています。printf で組み立てたパスを表示しておけば、意図したUNCパスになっているか確認できます。
絶対パス化(-a)とスラッシュ区切りのWindowsパス(-m)
wslpath には、-u / -w 以外にも補助的なオプションがあります。
-a は、変換結果を絶対パス形式にするオプションです。相対パスを絶対パス形式に変換したい場合に使用できます。ただし、-a はファイルやディレクトリの存在を保証するオプションではありません。変換できたことと、変換先のパスが実際に存在することは別なので、必要に応じて test -e や test -d などで確認してください。
cd /mnt/c/appwslpath -a ./nonexist/foo実行結果の例(/mnt/c/app/nonexist/foo は実在しないパスです):
/mnt/c/app/nonexist/foo-m は、-w と同様にWSLパスをWindowsパスへ変換しますが、区切り文字をバックスラッシュではなくスラッシュにします。バックスラッシュのエスケープを避けたい場合に便利です。
wslpath -m /mnt/c/Users実行結果の例:
C:/Users実務で役立つ!シェルスクリプト内でのwslpath活用事例
シェルスクリプトを作成する際、ハードコーディングされたパスを使用すると、ユーザー名が変わったり別のPC環境へ移行したりした際に動作しなくなります。 wslpath を変数に代入して動的にパスを生成することで、環境に依存しない堅牢なスクリプトを作成できます。
以下は、WSL側からWindows側のデスクトップディレクトリを特定し、その中にファイルをコピーするシェルスクリプトの例です。
#!/bin/bash
# Windows側でデスクトップの実際の場所を取得(OneDriveへの移動やフォルダーのリダイレクトにも対応)WIN_DESKTOP_PATH=$( powershell.exe -NoProfile -Command \ '[Environment]::GetFolderPath("Desktop")' | tr -d '\r')
# WindowsパスをWSLパスに変換DESKTOP_PATH=$(wslpath -u "$WIN_DESKTOP_PATH")
# コピー先の存在を確認if [ ! -d "$DESKTOP_PATH" ]; then echo "デスクトップディレクトリが見つかりません: $DESKTOP_PATH" >&2 exit 1fi
# ファイルのコピー処理echo "Copying file to: $DESKTOP_PATH"cp ./sample.txt "$DESKTOP_PATH/sample.txt"このように、Windows側から実際のフォルダーパスを取得して wslpath で変換することで、ユーザー名からパスを組み立てるよりも堅牢な自動化処理になります。なお、Windows側のデスクトップパスをWSLから変換できることが前提です。
スクリプト内でWindowsの実行ファイルを呼び出すコツ
シェルスクリプトからWindows側のアプリケーション(例えば notepad.exe や GitGit [ギット]ソースコードの変更履歴を管理する分散型バージョン管理システム for Windows のコマンドなど)を呼び出す場合、引数に渡すファイルパスはWindows形式である必要があります。
以下のスクリプト例では、WSL内のファイルをWindows側のメモ帳で開く処理を行っています。
#!/bin/bash
TARGET_FILE="./document.md"
# 絶対パス形式に変換してWindowsのメモ帳に渡すWIN_FILE_PATH=$(wslpath -wa "$TARGET_FILE")
notepad.exe "$WIN_FILE_PATH"-wa を併用して絶対パス形式に変換することで、相対パスの扱いを明確にできます。document.md が現在のディレクトリに存在すること、およびWindowsからアクセスできるパスに変換できることが前提です。
この手法を用いることで、Linuxのテキスト処理ツールでログを加工したあと、Windows側のネイティブアプリケーションで確認するといったワークフローをスムーズに構築できます。
よくあるエラーと注意点
wslpath を使用する際に発生しやすいエラーと、その対処法について解説します。
スペースを含むパスの扱い
Windowsのパスにはスペースが含まれることが多くあります(例: C:\Program Files)。シェルスクリプト内でコマンド置換や変数展開を行う際は、必ずダブルクォーテーションで囲むようにしてください。cd などのコマンドで、パスを変数に格納した場合も同様です(例: cd "$DESKTOP_PATH")。
誤った例:
cd $(wslpath -u 'C:\Program Files')正しい例:
cd "$(wslpath -u 'C:\Program Files')"クォートを忘れると、スペースで引数が分割されてしまい、cd: too many arguments や No such file or directory といったエラーが発生します。
存在しないパスや未マウントドライブの扱い
wslpath はパスの文字列変換を行うコマンドです。変換できたことと、そのパスに実際にファイルやディレクトリが存在してアクセスできることは別です。変換結果だけでなく、ls や test -e などで実際にアクセスできることも確認しましょう。
Windowsのドライブやネットワーク共有を変換する場合は、WSLから対象のファイルシステムにアクセスできるか確認してください。自動マウントの設定やネットワークドライブの状態などによっては、期待したパスに変換できない場合があります。マウント状況は df コマンドで確認できます。
実行しているディストリビューションによる結果の違い
wsl コマンドを引数なしで実行したときに入るのは、既定のディストリビューションです。筆者の環境では、DockerDocker [ドッカー]コンテナ型仮想化プラットフォーム Desktop が使う docker-desktop が既定になっていました(wsl -l -v で * が付いているものが既定です)。docker-desktop は開発用ではなく Docker Desktop 用の内部ディストリビューションです。ここで wslpath を実行すると本記事と異なる結果になることがあります。Docker Desktop をインストールしただけで必ず既定になるわけではないため、実行前に意図したディストリビューションであるか確認してください。
wslpath -w /mnt/c/Usersdocker-desktop での実行結果(筆者環境で確認):
\\wsl.localhost\docker-desktop\mnt\c\Users筆者環境の docker-desktop では、Cドライブが /mnt/host/c にマウントされていました(/proc/mounts で確認)。/mnt/c はWindowsドライブとして認識されず、/mnt/host/c/Users を指定すると C:\Users に変換されました。このマウント構成は Docker Desktop のバージョンによって変わる可能性があるため、あくまで参考例としてご覧ください。
また、前述のとおりUNCパスの変換は現在のディストリビューション限定です。意図した結果にならない場合は、次のコマンドで実行中のディストリビューションを確認してください。
echo "$WSL_DISTRO_NAME"PowerShell側では wsl -l -v でインストール済みのディストリビューションとデフォルト(* 付き)を確認できます。起動するディストリビューションを指定する場合は、wsl -d Ubuntu-24.04 のように実行します(Ubuntu-24.04 は例です。wsl -l -v で表示される名前を指定してください)。
まとめ:wslpathをマスターしてWSLとWindowsの連携をスムーズに
本記事では、WSL環境とWindowsの間でファイルパスを相互変換する wslpath コマンドの使い方について解説しました。
wslpath -wを使うことで、LinuxのパスをWindows形式のパスへ変換できるwslpath -uを使うことで、WindowsのパスをWSL形式のパスへ変換できる- シェルスクリプト内でWindowsの実行ファイルを呼び出す際や、ファイルを相互にやり取りする場面でパス変換エラーを防ぐために重要な役割を持つ
- 変数展開時はダブルクォーテーションで囲むことで、スペースを含むパスによるエラーを防ぐことができる
wslpath コマンドを日々の開発や運用スクリプトに取り入れることで、WindowsとWSLの境界を意識することなく、効率的なファイル操作と自動化を実現できます。ぜひ活用してみてください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。