5

我正在寻找一种将 Win32 路径转换为 ​​POSIX 路径的方法,最好使用 Win32 工具。

背景

最新的 Windows 10 Insider Build 引入了适用于 Linux 的 Windows 子系统 (WSL),其中包括bash由 Ubuntu 背后的公司 Canonical 提供的本机。他们的实现bash使用了相当复杂的Bash on Ubuntu on Windows名称,我将bash.exe在下面引用它。

相当于访问 Windows 中的路径C:\Users\me\Desktop是.bash.exe/mnt/c/Users/me/Desktop

我正在尝试bash.exe从 Windows 命令提示符(例如bash -c ls /mnt/me/Desktop)传递路径。由于这需要我传递 POSIX 路径,我想知道微软是否提供任何工具以编程方式将 Win32 路径转换为 ​​POSIX 路径(就像cygpath在 Cygwin 或winepathWine 中所做的那样)

备择方案

除非 Windows 附带任何翻译工具,否则我对确定路径的替代方法持开放态度,例如使用 Node 或 Python。

4

5 回答 5

3

WSL 实用程序包现在通过wslpath命令提供此功能。

WSLU 默认随 Ubuntu 发行版一起安装,但可能需要手动添加到其他发行版。软件包安装说明在上面链接的 Github 页面上。

Bash 或其他 POSIX shell 的示例用法:

cd $(wslpath 'C:\Users\<username>\Desktop')

... 将更改为/mnt/c/Users/<username>/Desktop.

-w使用以下选项也可以进行反向转换:

mspaint.exe ~/profile.jpg

... 将\\wsl$\<distroname>\home\<username>\profile.jpg在 Paint 应用程序中打开文件。

于 2021-10-09T19:41:56.673 回答
2

我在 [0] 处编写了一个小的 shell 脚本,这是一个开始,我想随着时间的推移进行改进。我猜“sed”是做一些字符串替换的好工具。

这里是当前状态:

linuxify() {
    windowspath=$1
    temppath="$(echo $windowspath | sed -E 's/([A-Z]):/\/mnt\/\L\1/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

于 2017-10-04T10:05:37.040 回答
1

跟进@ToTamire 的回答。虽然我已经对其进行了编辑以添加有关 使用的一些信息,wslpath但该答案(以及所有先前的答案)的重点是从WSL内部使用它。

最初在这里提出的问题是如何在Windows(而不是 WSL)中执行此操作并“将路径传递给bash.exe”,因此让我们看一些(新的,因为最初提出问题)选项。我仍然会使用wslpath,但通过命令(在wsl.exe提出问题时它也不可用,但替换了bash.exeWSL 的命令)。

由于问题是“来自 Windows 命令提示符”,我们将使用 CMD,尽管我更喜欢 PowerShell,因为它具有更现代的进程替换和引用/转义规则。

在 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 主/配置文件目录中创建一个文件(从 CMD 开始)

    • 命令:
      for /f %p in ('wsl ~ wslpath "%userprofile%"') do set wsl_path=%p
      wsl ~ -e sh -c "touch \"%wsl_path%/StackOverflowTest\""
      
    • 结果:StackOverflowTest在您的 Windows 主/配置文件目录中 创建文件
于 2021-10-10T04:30:13.670 回答
0

事实证明,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(":", "")
于 2016-07-02T12:50:13.997 回答
-2

Windows 的 Linux 子系统中 Ubuntu 位置的路径位于此处:

C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
于 2018-08-23T23:55:02.577 回答