如何为 Windows 子系统翻译 Windows 路径 Linux
How to translate a Windows path for Windows Subsystem for Linux
我正在寻找一种将 Win32 路径转换为 POSIX 路径的方法,最好使用 Win32 工具。
背景
最新的 Windows 10 Insider Build 为 Linux (WSL) 引入了 Windows 子系统,包括 [=52] 背后的公司 Canonical 提供的本机 bash
=].他们对 bash
的实现采用了相当复杂的名称 Bash on Ubuntu on Windows,我将在下文中将其称为 bash.exe
。
访问 bash.exe
中的 Windows 路径 C:\Users\me\Desktop
的等价物是 /mnt/c/Users/me/Desktop
.
我正在尝试从 Windows 命令提示符(例如 bash -c ls /mnt/me/Desktop
)传递到 bash.exe
的路径。由于这需要我传递 POSIX 路径,我想知道 Microsoft 是否提供任何工具以编程方式将 Win32 路径转换为 POSIX 路径(如 cygpath
在 Cygwin 中所做的,或 winepath
关于葡萄酒)
备选方案
除非 Windows 附带任何翻译工具,否则我愿意接受其他方法来确定路径,例如使用 Node 或 Python.
原来 NodeJS 有一个内置的模块来处理这种东西,叫做 path
。虽然它不能完全解决手头的问题,但它是一个有效的解决方法(对我而言)。只需 require("path")
并决定块或一个班轮。
这是方块:
var p = require("path")
var path = "C:\Users\me\Desktop"
var sepa = path.split(p.win32.sep)
var newS = [].concat([sepa[0].toLowerCase()], sepa.slice(1))
var newP = "/mnt/" + p.posix.join.apply(p.posix, newS).replace(":", "")
// newP == "/mnt/c/Users/me/Desktop
作为一个班轮:
var p = require("path")
var d = "/mnt/" + p.posix.join.apply(p.posix, [].concat(["C:\Users\me\Desktop".split(p.win32.sep)[0].toLowerCase()], "F:\Users\me\Desktop".split(p.win32.sep).slice(1))).replace(":", "")
我在 [0] 写了一个小的 shell 脚本,这是一个开始,我想随着时间的推移改进。我想 "sed" 是进行一些字符串替换的好工具。
这里是当前状态:
linuxify() {
windowspath=
temppath="$(echo $windowspath | sed -E 's/([A-Z]):/\/mnt\/\L/g')" # C: -> /mnt/c, E: -> /mnt/e
temppath="$(echo $temppath | sed 's/\/\//g')" # backslash -> forward slash
linuxpath=$temppath
echo $linuxpath
}
那你就可以这样使用了
cd "`linuxify "E:\Marvin Kastner\Documents\Uni\Master\gitrepos\masterarbeit_neu"`"
[0] https://gist.github.com/1kastner/723a52f352c3eead42988c26b4ade5d0
Ubuntu 在 Windows 的 Linux 子系统中的路径位于此处:
C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
WSL Utilities 软件包现在通过 wslpath
命令提供此功能。
WSLU 默认安装在 Ubuntu 发行版中,但可能需要手动添加到其他发行版中。软件包安装说明在上面链接的 Github 页面上。
Bash 或其他 POSIX shell 的用法示例:
cd $(wslpath 'C:\Users\<username>\Desktop')
...将更改为 /mnt/c/Users/<username>/Desktop
。
反向转换也可以使用 -w
选项:
mspaint.exe $(wslpath -w ~/profile.jpg)
... 将在画图应用程序中打开文件 \wsl$\<distroname>\home\<username>\profile.jpg
。
跟进@ToTamire 的回答。虽然我已经对其进行了编辑以添加一些有关 wslpath
用法的信息,但该答案(以及之前的所有答案)的重点是在 inside[=62] 中使用它=] WSL.
这里最初问的问题是如何在Windows(而不是WSL)中做到这一点和“传递路径到bash.exe
” ,所以让我们看看一些(新的,因为这个问题最初是被问到的)选项。我仍然会使用 wslpath
,但是 通过 wsl.exe
命令(在提出问题时该命令也不可用,但替换了 bash.exe
WSL 命令)。
由于问题是“来自 Windows 命令提示符”,我们将使用 CMD,尽管我更喜欢 PowerShell,因为它更现代的进程替换和 quoting/escaping 规则。
在 CMD 中:
示例 1: 将 Windows 路径转换为 WSL/Linux 格式
- 命令:
wsl wslpath "C:\"
- 结果: 输出
/mnt/c
示例 2: 通过 for
将 Windows 路径转换为 WSL/Linux 格式
- 命令:
for /f %p in ('wsl wslpath "C:\"') do echo %p
- 结果:同时输出
/mnt/c
示例 3: 在 WSL 中使用 touch
在您的 Windows home/profile 目录中创建一个文件(开始来自 CMD)
- 命令:
for /f %p in ('wsl ~ wslpath "%userprofile%"') do set wsl_path=%p
wsl ~ -e sh -c "touch \"%wsl_path%/WhosebugTest\""
- 结果: 在您的 Windows home/profile 目录
中创建文件 WhosebugTest
我正在寻找一种将 Win32 路径转换为 POSIX 路径的方法,最好使用 Win32 工具。
背景
最新的 Windows 10 Insider Build 为 Linux (WSL) 引入了 Windows 子系统,包括 [=52] 背后的公司 Canonical 提供的本机 bash
=].他们对 bash
的实现采用了相当复杂的名称 Bash on Ubuntu on Windows,我将在下文中将其称为 bash.exe
。
访问 bash.exe
中的 Windows 路径 C:\Users\me\Desktop
的等价物是 /mnt/c/Users/me/Desktop
.
我正在尝试从 Windows 命令提示符(例如 bash -c ls /mnt/me/Desktop
)传递到 bash.exe
的路径。由于这需要我传递 POSIX 路径,我想知道 Microsoft 是否提供任何工具以编程方式将 Win32 路径转换为 POSIX 路径(如 cygpath
在 Cygwin 中所做的,或 winepath
关于葡萄酒)
备选方案
除非 Windows 附带任何翻译工具,否则我愿意接受其他方法来确定路径,例如使用 Node 或 Python.
原来 NodeJS 有一个内置的模块来处理这种东西,叫做 path
。虽然它不能完全解决手头的问题,但它是一个有效的解决方法(对我而言)。只需 require("path")
并决定块或一个班轮。
这是方块:
var p = require("path")
var path = "C:\Users\me\Desktop"
var sepa = path.split(p.win32.sep)
var newS = [].concat([sepa[0].toLowerCase()], sepa.slice(1))
var newP = "/mnt/" + p.posix.join.apply(p.posix, newS).replace(":", "")
// newP == "/mnt/c/Users/me/Desktop
作为一个班轮:
var p = require("path")
var d = "/mnt/" + p.posix.join.apply(p.posix, [].concat(["C:\Users\me\Desktop".split(p.win32.sep)[0].toLowerCase()], "F:\Users\me\Desktop".split(p.win32.sep).slice(1))).replace(":", "")
我在 [0] 写了一个小的 shell 脚本,这是一个开始,我想随着时间的推移改进。我想 "sed" 是进行一些字符串替换的好工具。
这里是当前状态:
linuxify() {
windowspath=
temppath="$(echo $windowspath | sed -E 's/([A-Z]):/\/mnt\/\L/g')" # C: -> /mnt/c, E: -> /mnt/e
temppath="$(echo $temppath | sed 's/\/\//g')" # backslash -> forward slash
linuxpath=$temppath
echo $linuxpath
}
那你就可以这样使用了
cd "`linuxify "E:\Marvin Kastner\Documents\Uni\Master\gitrepos\masterarbeit_neu"`"
[0] https://gist.github.com/1kastner/723a52f352c3eead42988c26b4ade5d0
Ubuntu 在 Windows 的 Linux 子系统中的路径位于此处:
C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
WSL Utilities 软件包现在通过 wslpath
命令提供此功能。
WSLU 默认安装在 Ubuntu 发行版中,但可能需要手动添加到其他发行版中。软件包安装说明在上面链接的 Github 页面上。
Bash 或其他 POSIX shell 的用法示例:
cd $(wslpath 'C:\Users\<username>\Desktop')
...将更改为 /mnt/c/Users/<username>/Desktop
。
反向转换也可以使用 -w
选项:
mspaint.exe $(wslpath -w ~/profile.jpg)
... 将在画图应用程序中打开文件 \wsl$\<distroname>\home\<username>\profile.jpg
。
跟进@ToTamire 的回答。虽然我已经对其进行了编辑以添加一些有关 wslpath
用法的信息,但该答案(以及之前的所有答案)的重点是在 inside[=62] 中使用它=] WSL.
这里最初问的问题是如何在Windows(而不是WSL)中做到这一点和“传递路径到bash.exe
” ,所以让我们看看一些(新的,因为这个问题最初是被问到的)选项。我仍然会使用 wslpath
,但是 通过 wsl.exe
命令(在提出问题时该命令也不可用,但替换了 bash.exe
WSL 命令)。
由于问题是“来自 Windows 命令提示符”,我们将使用 CMD,尽管我更喜欢 PowerShell,因为它更现代的进程替换和 quoting/escaping 规则。
在 CMD 中:
示例 1: 将 Windows 路径转换为 WSL/Linux 格式
- 命令:
wsl wslpath "C:\"
- 结果: 输出
/mnt/c
- 命令:
示例 2: 通过
将 Windows 路径转换为 WSL/Linux 格式for
- 命令:
for /f %p in ('wsl wslpath "C:\"') do echo %p
- 结果:同时输出
/mnt/c
- 命令:
示例 3: 在 WSL 中使用
touch
在您的 Windows home/profile 目录中创建一个文件(开始来自 CMD)- 命令:
for /f %p in ('wsl ~ wslpath "%userprofile%"') do set wsl_path=%p wsl ~ -e sh -c "touch \"%wsl_path%/WhosebugTest\""
- 结果: 在您的 Windows home/profile 目录 中创建文件
WhosebugTest
- 命令: