如何使用标准 msys 功能将 Windows 目录路径(例如 c:/libs/Qt-static
)转换为正确的 POSIX 目录路径(/c/libs/Qt-static
)?反之亦然。
cygpath.exe
的实用工具,专门用于此目的。我不了解 msys
,但是快速的谷歌搜索显示它包含了 sed
工具。所以,假设在 msys
中它的使用方式与本地 Linux 相似,这里有一种方法可以实现:
你需要用斜杠替换所有反斜杠,删除驱动器字母后面的第一个冒号,并在开头添加一个斜杠:
echo "/$pth" | sed 's/\\/\//g' | sed 's/://'
正如xaizek所指出的那样,
echo "/$pth" | sed -e 's/\\/\//g' -e 's/://'
您需要添加一个分号,移除第一个斜杠并将所有斜杠替换为反斜杠:
echo "$pth" | sed 's/^\///' | sed 's/\//\\/g' | sed 's/^./\0:/'
或者更高效地说,
echo "$pth" | sed -e 's/^\///' -e 's/\//\\/g' -e 's/^./\0:/'
其中$pth
是分别存储Windows或POSIX路径的变量。
sed
调用,只需将多个-e command
参数传递给单个实例即可(例如sed -e one -e two
)。 - xaizekecho "$pth" | sed -e 's#\\#/#g' -e 's#\$#/\\$#g' -e 's#^\([a-zA-Z]\):#/\L\1#
- Francoisecho "$pth" | sed -e 's/\\/\//g' -e 's/\([a-zA-Z]\):/\/\1/g'
- Klamer SchutteX:
(其中X
是驱动器字母)变成了/x
,因此sed 's/://'
应该改为sed -r 's|^([^:]+):|\/\L\1|'
(至少在Git Bash中使用时;我还自作主张将/
更改为|
,因为我个人认为在sed
脚本中这样做会更清晰易懂)。 - HelloGoodbye只需使用cygpath
:
$ cygpath -w "/c/foo/bar"
-> C:\foo\bar
$ cygpath -u "C:\foo\bar"
-> /c/foo/bar
cygpath
?”好吧,
cygpath
可以在git-bash-install-folder\usr\bin\cygpath.exe
找到。$ MSYS_NO_PATHCONV=1 taskkill /F /T /IM ssh-agent.exe
以下是我的实现(在Git Bash上测试通过)。
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/
)是其核心,它在第二个/
之前插入:
。我使用,
作为分隔符,而不是/
以便阅读。如果以/
开头(\,^/,
),则用:/
替换第二个出现的/
。我不想假设驱动器字母长度为1,因此这适用于/sd0/some/dir
。
s,^/,,
去除前导的/
,s,/,\\,g
将所有/
转换为\\
。
\,/$,! s,$,/,
用于处理/c
的特殊情况,并确保下一个命令的第二个/
(/c/
)起作用。
注意:
如果在您的shell中无法使用此处字符串<<<
,则可以使用echo
和管道。
echo "$@" | sed ...
Errata
Here e script
提供信息 - 至少对于我的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路径放在双引号内,这种类型的转换似乎是自动完成的。不幸的是,我没有参考原始文档来支持这一点。
@hello_earth的回答是误导性的,因为Windows路径必须使用双反斜杠,例如:
cd "e:\\dir\\subdir\\path"
grep -lr "D:\\\\example" /parent-folder | xargs -d'\n' sed -i 's+\\+\/+g'
第二步将 D:/example 替换为 /example:
grep -lr "D:/example" /parent-folder | xargs -d'\n' sed -i 's+D:+/example+g'
我想分享这个解决方案,因为我花了一些时间来编写这两行代码,但它真的是非常有用的工作(我正在将一个Windows应用程序迁移到一个充满Windows路径的Linux服务器上)。
我认为这可以帮助你。我为自己做了这个。
这将把所有Windows路径转换为POSIX路径:
https://github.com/hypolas/wintobashpath
技术:
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。
如果您有任何建议,我可以为您更新此内容,以帮助更多的人。
cygpath
似乎在MINGW64(git bash)上可以使用。不确定是因为我也安装了cygwin,还是因为自从这个问题被提出后已经添加到系统中了 - 但我能够从cygpath 'd:\something'
得到预期的结果 - 它如何自动将来自剪贴板或自定义环境变量的字符串翻译? - hoodpwd | cygpath -w --
优于cygpath -w $(pwd)
。这真是太烦人了<sigh/>。 - JJS