【问题标题】:Windows PATH to posix path conversion in bashbash 中的 Windows PATH 到 posix 路径的转换
【发布时间】:2012-11-21 23:30:20
【问题描述】:

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

【问题讨论】:

    标签: windows string bash path msys


    【解决方案1】:

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

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

    否则 shell 会找到转义序列。

    【讨论】:

      【解决方案2】:

      只需使用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,则可以在 git-bash-install-folder\usr\bin\cygpath.exe 找到 cygpath
      4. 否则:也许不是,但我相信您可以找到安装它的方法。

      【讨论】:

        【解决方案3】:

        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'

        【讨论】:

        • 谁对这个答案投了反对票,也请评论任何错误,以便我纠正...... :-)
        • cygpath 似乎适用于 MINGW64 (git bash)。不知道是因为我也安装了 cygwin 还是因为这个问题已经添加了 - 但我从 cygpath 'd:\something' 得到了预期的结果 - 它如何自动翻译剪贴板或自定义环境变量中的字符串?
        • @hood: “不确定是不是因为我也安装了 cygwin” 是的,这可能是解释... “它怎么会自动翻译一个来自剪贴板或自定义环境变量的字符串” 不确定这里的预期内容。
        • cygpath.exe 在安装 git-bash 时包含在内。你不需要拥有 cygwin,甚至不需要知道 cygwin 是什么。当你使用 git-bash 时它在路径中
        【解决方案4】:

        仅供参考 - 至少对于我的 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 路径放在双引号内。不幸的是,我没有参考可以支持这一点的原始文档。

        【讨论】:

          【解决方案5】:

          我的解决方案适用于文件夹/文件列表,分两步完成。 假设您想替换从 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'
          

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

          【讨论】:

            【解决方案6】:

            MSYS 中“正确”的方式是:

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

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

            【讨论】:

              【解决方案7】:

              这是我的实现(在 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/)是它的核心,并在2nd / 之前插入:。我使用, 代替/ 来表示可读性。如果以/ (\,^/,) 开头,则将/ 替换为:/ 以获取2nd 的出现。我不想假设驱动器号长度为 1,所以这适用于 /sd0/some/dir

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

              \,/$, !s,$,/, 是处理/c 的角落情况并确保第二个/ (/c/) 以便下一个命令起作用。

              注意:

              如果这里的字符串&lt;&lt;&lt; 在您的shell 中不起作用,那么您可以echo 和管道作为

              echo "$@" | sed ...
              

              勘误表

              这里e script

              【讨论】:

                【解决方案8】:

                我不知道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 路径的变量。

                【讨论】:

                • 在 Windows 到 POSIX 前导斜杠是多余的。
                • @Dukales:...为什么? AFAIK,没有前导斜杠,它表示 relative 路径,而前导斜杠使其成为 absolute 路径 w.r.t.文件系统根目录
                • 你知道,没有必要通过管道多次调用sed,只需将多个-e command 参数传递给单个实例(如sed -e one -e two)。
                • 使用 git 自带的 bash 时,盘符需要小写,有些文件夹名可能以 '$' 开头 - 试试这个:echo "$pth" | sed -e 's#\\#/#g' -e 's#\$#/\\$#g' -e 's#^\([a-zA-Z]\):#/\L\1#
                • 将具有多个路径的字符串从 Windows 转换为 POSIX 时,必须将前导 / 添加到每个路径。更高效的命令版本将变为:echo "$pth" | sed -e 's/\\/\//g' -e 's/\([a-zA-Z]\):/\/\1/g'
                猜你喜欢
                • 2022-11-16
                • 1970-01-01
                • 2013-11-28
                • 2019-11-14
                • 2019-06-11
                • 1970-01-01
                • 2019-08-18
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多