问题描述
我似乎遇到了 GnuWin32 的 mkdir 的奇怪行为(来自 here):
C:\sandBox>"C:\Program Files (x86)\GnuWin32\bin\mkdir.EXE" --verbose -p Q:/scratch/foo/bar
C:\Program Files (x86)\GnuWin32\bin\mkdir.EXE: created directory `Q:/scratch'
C:\Program Files (x86)\GnuWin32\bin\mkdir.EXE: created directory `Q:/scratch/foo'
C:\Program Files (x86)\GnuWin32\bin\mkdir.EXE: created directory `Q:/scratch/foo/bar'
在上面,当前驱动器是C,目标驱动器是Q。
正如预期的那样,层次结构是在 Q:/scratch/foo/bar
现在,几乎相同的示例,但当前驱动器和目标驱动器都是 C。
C:\sandBox>"C:\Program Files (x86)\GnuWin32\bin\mkdir.EXE" --verbose -p C:/scratch/foo/bar
C:\Program Files (x86)\GnuWin32\bin\mkdir.EXE: created directory `C:/scratch'
C:\Program Files (x86)\GnuWin32\bin\mkdir.EXE: created directory `C:/scratch/foo'
C:\Program Files (x86)\GnuWin32\bin\mkdir.EXE: created directory `C:/scratch/foo/bar'
mkdir 的输出看起来正确且非常可预测。
但是,在 C:/scratch/foo/bar
处并没有真正创建任何内容。相反,目录层次结构是使用当前目录作为根创建的,即创建的是 C:/sandBox/scratch/foo/bar
谁能确认一下?这是一个错误吗? 如果我有时间,我会查看源代码,但是....
有谁知道比 5.3.0 更新的 CoreUtils 版本已经移植到 Win32 了吗?
解决方法
看起来确实是一个小错误。似乎 GnuWin32 的端口不喜欢驱动器号后面冒号后的正斜杠。使用反斜杠它与两者的行为都正确
C:\sandbox> mkdir --verbose -p Q:\scratch/foo/bar
和
C:\sandbox> mkdir --verbose -p C:\scratch/foo/bar
但是(据报道)当使用正斜杠时,它只能与
一起正确运行C:\sandbox> mkdir --verbose -p Q:/scratch/foo/bar
(在上面,注意目标与提示在不同的驱动器上)但不是
C:\sandbox> mkdir --verbose -p C:/scratch/foo/bar
(在上面,注意目标和提示在同一个驱动器上)
来自 UnxUtils 的真正古老的 mkdir 端口始终具有正确的行为。这是我能找到的唯一可行的替代方案。