56

最近的 NTFS 和 Windows 实现了符号链接:

但是在 Cygwin 1.7(安装在 Windows 7 上)上,ln -s会创建一个文本文件。

在 Cygwin 上:

$ ln -s -v target mylink
`mylink' -> `target'

在 MinGW(或您最喜欢的编辑器)上:

$ cat mylink
!<symlink>ÿþt a r g e t 

是否可以告诉 Cygwing 使用NTFS 连接点NTFS 符号链接

其他问题:这在 MinGW 上可用吗?

4

5 回答 5

88

⸻⸻⸻简答⸻⸻⸻

定义环境变量:

CYGWIN=winsymlinks:nativestrict

正如mwm所指出的,您可能还必须以管理员身份运行

⸻⸻⸻长答案⸻⸻⸻

默认 Cygwin 符号链接只是常规文件

默认情况下, Cygwin创建文本文件作为 Windows 符号链接缺陷的解决方法。这些文件并不是真正的符号链接。几乎所有 Windows 程序都不将这些文件视为符号链接。

本机符号链接在最新的 Windows 版本上可用

最近的 NTFS 和 Windows 实现了符号链接:

Cygwin 可以创建本机NTFS 符号链接

Cygwin 文档的简化摘录:

符号链接

[...]

Cygwin 可能以多种不同的方式创建符号链接:

  • 默认符号链接是普通文件,其中包含一个魔术 cookie,后跟链接指向的路径。[...]

  • 如果环境变量CYGWIN .lnk[...] 设置为包含字符串winsymlinkswinsymlinks:lnk. [...]

  • 本机 Windows 符号链接仅在 Windows Vista/2008 及更高版本上创建,并且仅在支持重解析点的文件系统上创建。由于它们奇怪的限制和行为,它们只有在用户明确请求创建它们时才会被创建。这是通过将环境变量 CYGWIN 设置为包含字符串winsymlinks:nativewinsymlinks:nativestrict. [...]

  • 在 NFS 文件系统上,Cygwin 总是创建真正的 NFS 符号链接。

配置 Cygwin

Cygwin 用户指南提供变量CYGWIN和选项winsymlinks

CYGWIN环境变量用于配置许多全局设置 [...] 。它包含下面列出的选项,以空白字符分隔。[...]

  • [...]
  • [...]
  • [...]
  • [...]
  • winsymlinks:{lnk,native,nativestrict}- 如果设置为 just winsymlinksor winsymlinks:lnk,Cygwin 将创建符号链接作为带有特殊标题和 R/O 属性集的 Windows 快捷方式。

    如果设置为winsymlinks:nativeor winsymlinks:nativestrict,Cygwin 在文件系统和支持它们的操作系统版本上创建符号链接作为本地 Windows 符号链接。如果已知操作系统不支持本机符号链接(Windows XP、Windows Server 2003),则每个会话都会生成一次警告消息。

    winsymlinks:native和 之间的区别在于winsymlinks:nativestrict:如果文件系统支持本机符号链接并且 Cygwin 由于某种原因未能创建本机符号链接,它将回退到创建 Cygwin 默认符号链接 with winsymlinks:native,而 with系统调用winsymlinks:nativestrictsymlink(2)立即失败。

CYGWIN=winsymlinks:native
始终创建链接,但在目标不存在时使用 Cygwin 回退

在 Cygwin 上:

$ export CYGWIN="winsymlinks:native"
$ ln -s -v target mylink
`mylink' -> `target'
$ echo content > target

在 MinGW 上:

$ cat mylink
content

将符号链接创建为虚拟文件时,同时使用 Windows 和 Cygwin 程序的人可能会遇到问题(缺少目标时的 Cygwin 回退)...

CYGWIN=winsymlinks:nativestrict
始终使用本机 Windows 符号链接,但在目标不存在时失败

在 Cygwin 上:

$ export CYGWIN="winsymlinks:nativestrict"
$ rm -f  a b
$ ln -sv a b
ln: failed to create symbolic link `b': No such file or directory
$ touch    b
$ ln -sv a b
ln: failed to create symbolic link `b': File exists
$ rm b
$ touch a
$ ln -sv a b
`b' -> `a'

因为nativestrict在创建符号链接之前要求目标存在,所以在创建链接时某些命令/脚本可能会失败。

注意:只有管理员才能创建本机 NT 符号链接,因此在 Windows UAC 下,Cygwin 终端仿真器 (mintty) 应以提升的权限运行(右键单击快捷方式并选择以管理员身份运行 或设置 mintty 快捷方式属性,高级 →以管理员身份运行)。

特别感谢GuriaSpooky的贡献。

于 2013-09-06T13:59:43.440 回答
7

公认的答案是正确的,两个小注解。

如果您只关心自己在命令行上创建的符号链接,请安装cygutils-extra包,它包含一个winln命令,其语法与 相同ln,但会创建本机 Windows 链接。创建一个别名:(alias ln=winln仅适用于交互式 shell),甚至ln用(也适用于 shell 脚本)替换文件winln- 但它可能会在下次coreutils更新包时被覆盖。

当我已经安装了 Cygwin 时,我才发现可以使用本机符号链接,并且我自己也添加了一些符号链接。所以在我设置CYGWIN=winsymlinks:native为我的系统环境变量之后,我想将所有现有的非本地链接转换为本地链接。这就是我所做的。

以防万一,请先备份整个 Cygwin 目录。

查找所有符号链接并将列表保存到/links文件: cd /; find . -regextype egrep -regex './(dev|proc|mnt|cygdrive)' -prune -o -type l -print >links

审查links。创建tar包含所有链接的存档:tar c --files-from=links >links.tar

提取tar存档:tar x --files-from=links <links.tar 由于现在启用了本机符号链接,因此 tar 将使用本机符号链接覆盖旧 Cygwin 的符号链接。

清理:rm -f links links.tar

PS一开始我用过CYGWIN=winsymlinks:nativestrict,但后来我发现在这种模式下,ln -s target link如果target不存在则失败。相比之下,将创建指向不存在native的 Cygwin(非本机)符号链接- 这与UNIX 系统上的行为相匹配。在极少数情况下,可能会破坏某些程序或脚本,例如 Gentoo脚本使用锁定文件,该文件是指向正在运行进程的 PID 的符号链接。在模式下,脚本停止工作,因为它无法再创建锁定文件。注意:是 Gentoo Linux 上的 crontab 帮助脚本,增加了对dirs 的支持,它与 Cygwin 配合得很好。linktargetlnnativestrictrun-cronsnativestrictrun-cronscron.{hourly,daily,weekly,monthly}/

于 2016-04-23T20:48:19.803 回答
4

由于@olibre 的答案对我不起作用。我刚刚创建了一个 shell 函数。

: '
mklink - Create NTFS (Windows) links that is usable by Windows and Cygwin

Usage: mklink [/D | /H | /J] <link-path> <target-path>

Options:
    /D    Directory Symbolic Link
    /H    Hardlink
    /J    Directory Junction (you should prefer /D)

With no options, it creates a NTFS file symlink.
'
mklink () {

    if [ "$#" -ge "3" ]; then
        cmd /c mklink "$1" "$(cygpath --windows --absolute "$2")" "$(cygpath --windows --absolute "$3")"
    else
        cmd /c mklink "$(cygpath --windows --absolute "$1")" "$(cygpath --windows --absolute "$2")"
    fi

}

请注意,您需要管理员权限(对于 Cygwin)才能毫无问题地运行上述内容。

请注意,我不知道符号链接到绝对路径与符号链接到使用 CMD 的相对路径之间是否有任何区别mklink。在 Linux 上,如果您决定移动符号链接或移动目标文件,或者两者都移动,这两种行为会有所不同。

于 2016-03-24T16:44:01.320 回答
0

我想最简单的方法是

  1. 从本地组策略编辑器授予SeCreateSymbolicLinkPrivilege(gpedit.msc,默认在路径上,非家庭版本)

  2. 创建以路径命名的脚本ln(batch 或 bash),实现类似于上述 shell 函数

  3. 利润

于 2018-12-14T11:08:19.600 回答
-5

您可能正在寻找一种使用 MSYS 到达目录树中另一个目的地的方法。有一种方法。您应该创建一个包含以下行的 shell 脚本(“*.sh”文件):

cd "/drive_letter/SubCatalogue/SubFolder/..." 
于 2014-04-12T19:50:23.093 回答