株式会社パレットリンクの@BaspisKawaEです。
今回は、Windowsのエクスプローラーで開いているフォルダへ、WSLから簡単に移動する方法について解説します。
よろしくお願いします!
対象読者: WindowsとWSLを行き来しながら作業している方
前提知識: WSLで基本的なLinuxコマンドを実行できる程度
この記事で学べること: エクスプローラーでコピーしたWindowsのパスを、WSL用へ自動変換して cd する方法
目次
1. 背景:WindowsとWSLでパスが違う
WSLを使っていると、
「エクスプローラーでは目的のフォルダを開いているのに、WSLでも同じ場所まで移動するのが面倒」
ということがあります。
たとえばWindows側では次のようなパスだったとします。
C:\Users\username\Documents\project
しかし同じ場所をWSLから見ると、
/mnt/c/Users/username/Documents/project
となります。
Windowsでは C:\...、WSLでは /mnt/c/... と、同じフォルダでもパスの書き方が異なります。
もちろん、
cd /mnt/c/Users/username/Documents/project
と入力すれば移動できます。
しかし、エクスプローラーですでに目的のフォルダを見つけているのに、WSL側で改めて長いパスを入力するのはあまりにも面倒です。
こういう所は自動化して怠けてなんぼだと思っています。
そこで今回は、
エクスプローラーでパスをコピー → WSLで短いコマンドを打つ
だけでそのフォルダへ移動できるようにしてみます。
次の章で完成形のイメージを先にお話してから、再現方法の手順解説に入っていきます。
2. 完成後の使い方
最終的な操作はとても単純です。(それが目的なので当たり前ですが)
Step 1: エクスプローラーでフォルダを選択
WSLから移動したいフォルダをWindowsのエクスプローラーで選択します。
Step 2: Ctrl + Shift + C
その状態で、
Ctrl + Shift + C
を押します。
Windows 11ではバージョン22H2から Ctrl + Shift + C が「パスのコピー」のショートカットとして追加されています1。
Windows 10には Ctrl + Shift + C の「パスのコピー」ショートカットはありません。
対象を選択して Shiftを押しながら右クリック →「パスのコピー」 を使います2。
Step 3: WSLで cdc
WSLへ戻り、
cdc
と入力します。
これだけで、
/mnt/c/Users/username/Documents/project
へ移動します。
普段の操作はこれだけです。わあ便利。
エクスプローラーでフォルダを選択
↓
Ctrl + Shift + C
↓
WSLで cdc
3. 再現方法
まずWSLで .bashrc を開きます。
nano ~/.bashrc
ファイルの末尾に次の関数を追加します。
cdc() {
local p
p="$(powershell.exe -NoProfile -Command '[Console]::OutputEncoding=[System.Text.Encoding]::UTF8; [Console]::Write((Get-Clipboard -Raw))')"
p="${p#\"}"
p="${p%\"}"
cd -- "$(wslpath -u "$p")"
}
保存したら設定を読み直します。
source ~/.bashrc
これで cdc が使えるようになります。
確認する場合は、
type cdc
を実行します。
正しく登録されていれば、cdc is a function のように表示されます。
4. cdc の中身
登録した関数は次の処理をまとめています。
4-1. クリップボードを読み取る
まず次の部分です。
powershell.exe -NoProfile -Command '[Console]::OutputEncoding=[System.Text.Encoding]::UTF8; [Console]::Write((Get-Clipboard -Raw))'
WSLからWindows側のPowerShellを呼び出し、Get-Clipboard -Raw でクリップボードの内容を1つの文字列として取得しています3。
また、
[Console]::OutputEncoding=[System.Text.Encoding]::UTF8
を指定して日本語を含むパスをUTF-8でWSL側へ渡します。
ここでは通常のPowerShell出力をそのまま使わず、
[Console]::Write(...)
で標準出力へ直接書き込んでいます。
PowerShellなどWindows側のコマンド出力では、行末がCRLFになる場合があります。
Bashの $(...) は末尾のLFを取り除きますが、CRまで必ず取り除くわけではありません4。
そのため、後から tr -d '\r\n' で削るのではなく、最初から行終端を付けずに出力する形にしています。
4-2. 引用符の有無を吸収する
本記事の確認環境では Ctrl + Shift + C でコピーした場合、クリップボードには次のような文字列が入りました。
C:\Users\username\Documents\project
一方エクスプローラーのGUIから「パスのコピー」を実行した場合は、次のように前後へ " が付くことを確認しました。
"C:\Users\username\Documents\project"
操作方法や環境によって引用符の有無が変わる可能性があるため、念のため次の処理を入れています。
p="${p#\"}"
p="${p%\"}"
前後に " があれば取り除き、付いていなければ何もしません。
今回の使い方では Ctrl + Shift + C を前提にしていますが、この処理を残しておけばGUIからコピーしたパスを使った場合にもそのまま動かせます。
4-3. WindowsのパスをWSL用へ変換する
Windows形式のパスをWSL形式へ変換するために、wslpath を使います。
wslpath -u "$p"
たとえば、
C:\Users\username\Documents
を渡すと、
/mnt/c/Users/username/Documents
へ変換されます。
wslpath は、WSL内でWindows形式とLinux形式のパスを変換するためのコマンドです5。
今回の -u は、Windows形式のパスをWSL形式へ変換する指定です。
なお、この方向への変換は wslpath の既定動作でもあります。
4-4. 変換先へ移動する
最後に、
cd -- "$(wslpath -u "$p")"
で、変換後のフォルダへ移動します。
つまり cdc の役割をまとめると、
- Windowsのクリップボードを読む
- 日本語をUTF-8で、余分な行終端を付けずに受け取る
- 前後に
"があれば取り除く - WindowsのパスをWSL形式へ変換する
- そのフォルダへ
cdする
という流れになります。
まとめ
- WindowsとWSLでは、同じフォルダでもパスの書き方が異なる
- Windows 11 22H2以降では
Ctrl + Shift + Cで選択項目のパスをコピーできる - Windows 10では Shift + 右クリックから「パスのコピー」を使う
- コピーされたパスは環境や操作の違いによって引用符の有無が異なるため、
cdc側で両方に対応させる -
wslpathを使うとWindowsのパスをWSL形式へ変換できる -
.bashrcにcdcを登録しておけば、クリップボードのフォルダへcdcだけで移動できる
長々と中身を解説しましたが、普段の操作は
だけです。
WSLとWindowsのエクスプローラーを行き来する機会が多い場合、長い /mnt/c/... や /mnt/d/... を毎回入力する必要がなくなります。
是非導入してみてください。
パレットリンクでは、日々のつながりや学びを大切にしながら、さまざまなお役立ち記事をお届けしています。よろしければ、ぜひ「Organization」のページもご覧ください。
また、私たちと一緒に未来をつくっていく仲間も募集中です。ご興味をお持ちの方は、ぜひお気軽にお問い合わせください。一緒に新しいご縁が生まれることを楽しみにしています。
-
窓の杜「Windows 11 2022 Update」のエクスプローラー解説。Windows 11 バージョン22H2で
Ctrl + Shift + Cが「パスのコピー」に割り当てられたことが紹介されている。https://forest.watch.impress.co.jp/docs/shseri/win1122h2/1442873.html ↩ -
Microsoft Q&Aでも、Windows 10では Shiftを押しながら右クリックすると「Copy as Path」が利用できると案内されている。https://learn.microsoft.com/en-us/answers/questions/3910053/copy-as-path ↩
-
Microsoft Learn「Get-Clipboard」。
-Rawを使うと、複数行のクリップボード内容も文字列配列ではなく1つの文字列として取得できる。Windows PowerShell 5.1でも利用可能。https://learn.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Management/Get-Clipboard?view=powershell-5.1 ↩ -
GNU Bash Reference Manual「Command Substitution」。
$(...)では標準出力末尾の newline が削除される。WindowsコマンドからCRLFが返る場合、LFだけが削除されCRが残るケースがあるため、本記事ではPowerShell側で行終端を付けずに出力している。https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html ↩ -
Microsoft Learn「WSL の相互運用性 — Windows と Linux の連携」では、
wslpath "C:\Users\username\file.txt"を/mnt/c/Users/username/file.txtへ変換する例が掲載されている。https://learn.microsoft.com/ja-jp/windows/dev-environment/wsl-interop ↩


