如何为 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