53

如何通过标准msys功能将Windows目录路径(例如c:/libs/Qt-static)转换为正确的POSIX目录路径( ) ?反之亦然?/c/libs/Qt-static

4

8 回答 8

58

Cygwin、Git Bash 和 MSYS2 有一个现成的实用程序,专门cygpath.exe用于执行此操作。

输出类型选项:
  -d, --dos 打印名称的 DOS(短)形式 (C:\PROGRA~1\)
  -m, --mixed 与 --windows 类似,但带有常规斜杠 (C:/WINNT)
  -M, --mode 报告文件模式(binmode 或 textmode)
  -u, --unix (默认) 打印 Unix 形式的 NAME (/cygdrive/c/winnt)
  -w, --windows 打印名称的 Windows 形式 (C:\WINNT)
  -t, --type TYPE 打印 TYPE 形式:'dos'、'mixed'、'unix' 或 'windows'
于 2012-12-04T12:16:44.600 回答
49

我不知道msys,但快速的谷歌搜索显示它包含该sed实用程序。因此,假设它msys在本机 Linux 上的工作方式相似,这是一种方法:

从 Windows 到 POSIX

您必须用斜杠替换所有反斜杠,删除驱动器号后的第一个冒号,并在开头添加一个斜杠:

echo "/$pth" | sed 's/\\/\//g' | sed 's/://'

或者,正如 xaizek 所指出的,

echo "/$pth" | sed -e 's/\\/\//g' -e 's/://'

从 POSIX 到 Windows

您必须添加一个分号,删除第一个斜杠并将所有斜杠替换为反斜杠:

echo "$pth" | sed 's/^\///' | sed 's/\//\\/g' | sed 's/^./\0:/'

或更有效地,

echo "$pth" | sed -e 's/^\///' -e 's/\//\\/g' -e 's/^./\0:/'

其中$pth是分别存储 Windows 或 POSIX 路径的变量。

于 2012-12-04T11:06:44.243 回答
9

只需使用cygpath

$ cygpath -w "/c/foo/bar"
 -> C:\foo\bar
$ cygpath -u "C:\foo\bar"
 -> /c/foo/bar

你可能想知道:“我cygpath安装了吗?” 好,

  1. 如果您使用的是 git-bash shell,那么可以。
  2. 如果你在cygwin,那么是的。
  3. 如果你在另一个 shell 中,但你之前已经安装了 git-bash,那么cygpath可以在git-bash-install-folder\usr\bin\cygpath.exe.
  4. 否则:也许不是,但我相信您可以找到安装它的方法。
于 2020-09-16T02:18:07.067 回答
6

MSYS 中的“正确”方式是:

$ MSYS_NO_PATHCONV=1  taskkill /F /T /IM ssh-agent.exe

这避免了必须手动翻译斜杠。它只是取消激活路径转换。

于 2019-11-13T09:11:53.200 回答
4

这是我的实现(在 git bash 上测试)。

从 POSIX 到 Windows

sed '
    \,/$, !s,$,/,
    \,^/, s,/,:/,2
    s,^/,,
    s,/,\\,g
    ' <<< "$@"

效劳于:

/c/git
relative/dir
c:/git
~
.
..
/c
/c/
./relative/dir
/sd0/some/dir/

除了

/
<path with space>

解释:

\,^/, s,/,:/,2(转换/drive/dir//drive:/dir/) 是它的核心,并在nd:之前插入。我使用delim 而不是可读性。如果以( ) 开头,则在第nd 次出现时替换为。我不想假设驱动器号长度为 1,所以这适用于.2/,//\,^/,/:/2/sd0/some/dir

s,^/,,删除前导/并将s,/,\\,g所有转换/\.

\,/$, !s,$,/,是处理极端情况/c并确保第二个//c/)以使下一个命令起作用。

笔记:

如果这里的字符串<<<在您的外壳中不起作用,那么您可以使用echo管道作为

echo "$@" | sed ...

勘误表

这里是脚本

于 2017-07-29T17:13:55.053 回答
2

仅供参考 - 至少对于我的 git 版本 2.26.2.windows.1 例如,如果我有像 C:\dev\work_setup\msk 这样的路径,我可以直接转到 Git Bash 并输入

cd "C:\dev\work_setup\msk"

这将导致当前文件夹更改为 /c/dev/work_setup/msk - 所以这种类型的转换似乎是自动完成的,只要我将 Windows 路径放在双引号内。不幸的是,我没有参考可以支持这一点的原始文档。

于 2021-01-08T08:43:09.327 回答
1

我的解决方案适用于文件夹/文件列表,分两步完成。假设您想替换从D:\example/example的路径,以获得重复此 Windows 路径的文件列表。

第一步它将反冲变为斜线

grep -lr "D:\\\\example" /parent-folder | xargs -d'\n' sed -i 's+\\+\/+g'

请注意,父文件夹可以是根 (/) 或您喜欢的任何内容,如果您的文件名或文件夹名称带有空格,则-d'\n'参数是必需的。

第二步,它将 D:/example 替换为 /example:

grep -lr "D:/example" /parent-folder | xargs -d'\n' sed -i 's+D:+/example+g'

我想分享这个解决方案,因为我花了一些时间来制作这两条线,但它确实很有帮助(我正在将 Windows 应用程序迁移到内部有大量 Windows 路径的 Linux 服务器)。

于 2020-10-19T09:13:59.487 回答
0

@hello_earth 的答案具有误导性,因为 Windows 路径必须是双反斜杠,如:

cd "e:\\dir\\subdir\\path"

否则 shell 会找到转义序列。

于 2021-06-07T19:46:58.580 回答