在bash中进行Windows PATH到posix的路径转换

3j86kqsm  于 2023-03-04  发布在  Windows
关注(0)|答案(9)|浏览(179)

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

6fe3ivhb

6fe3ivhb1#

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

Output type options:
  -d, --dos             print DOS (short) form of NAMEs (C:\PROGRA~1\)
  -m, --mixed           like --windows, but with regular slashes (C:/WINNT)
  -M, --mode            report on mode of file (binmode or textmode)
  -u, --unix            (default) print Unix form of NAMEs (/cygdrive/c/winnt)
  -w, --windows         print Windows form of NAMEs (C:\WINNT)
  -t, --type TYPE       print TYPE form: 'dos', 'mixed', 'unix', or 'windows'
lx0bsm1f

lx0bsm1f2#

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

w9apscun

w9apscun3#

只需使用cygpath

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

你可能会问:"我是否安装了cygpath?"
1.如果您使用的是git-bash shell,那么是的。
1.如果你在cygwin或mSYS2,那么是的。
1.如果你使用的是另一个shell,但是你之前安装过git-bash,那么cygpath可以在git-bash-install-folder\usr\bin\cygpath.exe中找到。
1.也许没有,但我相信你能找到安装它的方法。

t1rydlwq

t1rydlwq4#

MSYS中的“正确”方法是:

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

这避免了手动转换斜线,它只是简单地取消激活路径转换。

kiayqfof

kiayqfof5#

下面是我的实现(在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/)是它的核心,并在2/之前插入:。为了可读性,我使用,而不是/作为分隔符。如果以/开始(\,^/,),然后将/替换为:/以获得第二个2。我不想假设驱动器号长度为1,因此这适用于/sd0/some/dir
s,^/,,移除前导的/,并且s,/,\\,g将所有的/转换为\
\,/$, !s,$,/,用于处理/c的极端情况,并确保第二个//c/)用于下一个命令的工作。
注:
如果这里的字符串<<<在shell中不起作用,那么可以使用echo和管道作为

echo "$@" | sed ...
    • 勘误表**

这里e script

4c8rllxm

4c8rllxm6#

仅供参考-至少对于我的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路径放在双引号内。不幸的是,我没有参考原始文档,将备份。

sbtkgmzw

sbtkgmzw7#

我的解决方案使用文件夹/文件列表,它分两步完成。假设您想将路径从***D:\example*替换为 * a /example,以替换重复了此Windows路径的文件列表。
第一步,它将反斜杠更改为斜线

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

请注意,parent-folder***可以是根(/)或您喜欢的任何名称,如果您的文件名或文件夹名称中包含白色,则必须使用-d '\n'***参数。
第二步,将D:/example替换为/example:

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

我想分享这个解决方案,因为它花了我一些时间,使这2行,但它一直是真正有帮助的工作(我正在迁移一个Windows应用程序到Linux服务器与吨的Windows路径内')。

iszxjhcz

iszxjhcz8#

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

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

否则 shell 将找到转义序列。

zzzyeukh

zzzyeukh9#

我觉得这能帮到你。我是为了自己。
将所有Windows路径转换为POSIX路径:
https://github.com/hypolas/wintobashpath
技术:

  • 将Windows驱动器号转换为小写
  • 从反斜线更改为斜线
  • 在路径的开头添加斜线
  • 创建~/. bashrc. d/目录
  • 创建文件~/. bashrc. d/winToBashPath. bashrc
  • 将转换后的路径添加到~/. bashrc. d/winToBashPath. bashrc
  • 添加了以下行以保持~/. bashrc干净:
for the file in ~/.bashrc.d/*.bashrc;
do
    . "$file"
done

我的结果:

echo %PATH%
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\PowerShell\7\;C:\Program Files\nodejs;;E:\Program Files\Git\cmd;C:\Program Files\Go\bin;C:\Users\hypolas\AppData\Local\Microsoft\WindowsApps;C:\Users\hypolas\AppData\Local\Programs\Microsoft VS Code\bin;E:\msys64-2023\mingw64\bin;C:\Users\hypolas\AppData\Roaming\npm;C:\Users\hypolas\go\bin

变成:

echo $PATH
/mingw64/bin:/usr/bin:/c/Users/hypolas/bin:/c/Users/hypolas/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/usr/bin:/mingw64/bin:/usr/bin:/c/Users/hypolas/bin:/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/Windows/System32/OpenSSH:/c/Program Files/dotnet:/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/c/Program Files/PowerShell/7:/c/Program Files/nodejs

你可以把这个二进制文件放在你的Windows启动文件夹中,所以如果你用PATH安装新的软件,这个PATH会在启动时自动添加到bashrc中。
如果你有任何建议,我可以为你更新,如果这可以帮助很多人。

相关问题