【WSL】wslpathコマンドでWindowsとLinuxのパスを相互変換する方法

【WSL】wslpathコマンドでWindowsとLinuxのパスを相互変換する方法

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:4,979

WSL環境とWindowsの間でファイルパスを相互変換できるwslpathコマンドの使い方を徹底解説。シェルスクリプトでのパス指定ミスやエラーを防ぎ、シームレスにファイルをやり取りするための実用的なテクニックを紹介します。

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

ベストセラー

世界一流エンジニアの思考法

難易度
実用性
思考法

技術スキル以上に大切な「考え方」をアップデートできる。世界基準の効率的な仕事術が学べます。

文系社会人のためのIT資格の歩き方: 文系のあなたに最適な道をご提案します (YKcreate kiki)

難易度
実用性
キャリア度

ロードマップが非常に明確。キャリアプランを見据えた、無駄のない学習順序を提案してくれます。

エンジニアを説明上手にする本 相手に応じた技術情報や知識の伝え方

難易度
実用性
コミュ力

「伝える技術」もエンジニアの重要なスキル。相手の視点に立った、具体的な説明のコツが満載です。

技術広報入門 ー テックブログから始めるエンジニアカルチャーのつくり方

難易度
実用性
独自性

テックブログを入口にエンジニア組織の文化をどう設計し、育てていくかという実践論が学べます。

WSL(Windows Subsystem for LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネル)環境で作業をしていると、「Linux側のシェルスクリプトからWindows側のファイルやツールを操作したい」「Windowsのパス形式をLinux形式に変換してスクリプトに渡したい」という場面に直面することがあります。しかし、Windowsのパス区切り文字(\)とLinuxのパス区切り文字(/)の違いやドライブレターの表現方法の差異により、パスの指定ミスやエラーに悩まされた経験はないでしょうか。

この記事を読むことで、WSLに標準搭載されている wslpath コマンドを用いたファイルパスの相互変換方法を習得できます。シェルスクリプト内でのパス指定ミスを防ぎ、WindowsとWSLの間でファイルをスムーズに連携させるための実用的なテクニックを確認していきましょう。

確認した環境

本記事で解説するコマンドや手順は、以下の環境で動作を確認しています。

なお、記事中の 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 コマンドの基本的な構文は以下の通りです。

Terminal window
wslpath [-a] [-u|-w|-m] <パス>

オプションを省略した場合は、-u(Windowsパス → WSLパス)が既定の変換方向として使用されます。WSL形式のパスをWindows形式に変換したい場合は、-w または -m を明示してください。変換方向を指定することで、意図しないパス変換を防ぎやすくなります。

WSLからWindowsパスへ変換する方法(-wオプション)

Linux(WSL)形式のパスを、Windows形式のパス(バックスラッシュ区切り、ドライブレター付き)に変換したい場合は、-w オプションを使用します。

例えば、WSL内のホームディレクトリにあるファイルを指定する場合の実行例は以下の通りです。

Terminal window
wslpath -w /home/username/project

実行結果の例:

\\wsl.localhost\Ubuntu\home\username\project

このように、WSL内部のファイルは \\wsl.localhost\<ディストリビューション名>\... という形式のUNCパスに変換されます。/mnt/c などのマウントされたWindowsドライブを指定した場合は、より直感的なドライブレター形式に変換されます。出力例の Ubuntu はディストリビューション名です。実際に使っている名前に読み替えてください。

Terminal window
wslpath -w /mnt/c/Users/username/Documents

実行結果の例:

C:\Users\username\Documents

WindowsからWSLパスへ変換する方法(-uオプション)

逆に、Windows形式のパスやエクスプローラーからコピーしたパスを、WSLで使用できるLinux形式のパスに変換したい場合は、-u オプションを使用します。

Windowsのパスを指定する際は、バックスラッシュ(\)がシェルのエスケープ文字として解釈されないよう、シングルクォーテーションで囲むか、スラッシュ(/)に置き換えて指定します。

Terminal window
wslpath -u 'C:\Users\username\Documents'

実行結果の例:

/mnt/c/Users/username/Documents

また、WSL内部の領域を指すUNCパス(\\wsl.localhost\...)も変換できます。これにより、Windows側のアプリケーションから渡されたパスを、WSL内のスクリプトで正しく処理できるようになります。

Terminal window
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 などで確認してください。

Terminal window
cd /mnt/c/app
wslpath -a ./nonexist/foo

実行結果の例(/mnt/c/app/nonexist/foo は実在しないパスです):

/mnt/c/app/nonexist/foo

-m は、-w と同様にWSLパスをWindowsパスへ変換しますが、区切り文字をバックスラッシュではなくスラッシュにします。バックスラッシュのエスケープを避けたい場合に便利です。

Terminal window
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 1
fi
# ファイルのコピー処理
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")。

誤った例:

Terminal window
cd $(wslpath -u 'C:\Program Files')

正しい例:

Terminal window
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 をインストールしただけで必ず既定になるわけではないため、実行前に意図したディストリビューションであるか確認してください。

Terminal window
wslpath -w /mnt/c/Users

docker-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パスの変換は現在のディストリビューション限定です。意図した結果にならない場合は、次のコマンドで実行中のディストリビューションを確認してください。

Terminal window
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ライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

人気記事


記事を評価

Thanks!
目次
Scroll to Top