为Cygwin启用本地NTFS符号链接

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

  • 自NTFS 3.0(Windows 2000)使用linkdjunction工具以来, NTFS联结点可用作目录符号链接。
  • 自Windows Vista使用mklink工具以来, NTFS符号链接也可以用作符号链接(用于文件和目录)。

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

在Cygwin上:

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

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

 $ cat mylink !<symlink>ÿþt arget 

是否有可能告诉Cygwing使用NTFS交接点或NTFS符号链接 ?

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

——-简答——-

定义环境variables:

 CYGWIN=winsymlinks:nativestrict 

正如mwm指出的那样,您可能还必须以pipe理员身份运行bash 。

——-长答案——-

默认的Cygwin符号链接只是普通的文件

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

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

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

  • 自NTFS 3.0(Windows 2000)使用linkdjunction工具以来, NTFS联结点可用作目录符号链接。
  • 自Windows Vista使用mklink工具以来, NTFS符号链接也可以用作符号链接(用于文件和目录)。

Cygwin可以创build本地NTFS符号链接

Cygwin文档的简化提取:

符号链接

[…]

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

  • 默认的符号链接是纯文件,其中包含一个魔术cookies,后面跟着链接指向的path。 […]

  • 如果环境variablesCYGWIN […]设置为包含stringwinsymlinkswinsymlinks:lnk创build快捷方式符号链接为Windows .lnk […]。 […]

  • 本机Windows符号链接仅在Windows Vista / 2008和更高版本上创build,并且仅在支持重新分析点的文件系统上创build。 由于他们奇怪的限制和行为,只有当用户明确要求创build它们时才会创build它们。 这是通过将环境variablesCYGWIN设置为包含stringwinsymlinks:nativewinsymlinks:nativestrict 。 […]

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

configurationCygwin

Cygwin用户指南介绍variablesCYGWIN和选项winsymlinks

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

  • […]
  • […]
  • […]
  • […]
  • winsymlinks:{lnk,native,nativestrict} – 如果设置为winsymlinks或者winsymlinks:lnk ,Cygwin创build符号链接作为具有特殊前端和R / O属性集的Windows快捷方式。

    如果设置为winsymlinks:nativewinsymlinks:nativestrict ,则Cygwin将创build符号链接作为支持文件系统和操作系统版本的本机Windows符号链接。 如果已知操作系统不支持本机符号链接(Windows XP,Windows Server 2003),则每个会话将产生一次警告消息。

    winsymlinks:nativewinsymlinks:nativestrict之间的区别是这样的:如果文件系统支持本地符号链接,并且Cygwin由于某种原因无法创build本机符号链接,它将回退到使用winsymlinks:native创buildCygwin默认符号链接winsymlinks:native ,而使用winsymlinks:nativestrict symlink(2)系统调用将立即失败。

CYGWIN=winsymlinks:native很好

在Cygwin上:

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

在MinGW上:

 $ cat mylink content 

CYGWIN=winsymlinks:nativestrict严格

nativestrict需要在符号链接创build之前存在目标。

Cygwin示例:

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

注意:只有pipe​​理员能够创build本地NT符号链接,所以在Windows UAC下,Cygwinterminal仿真器(mintty)应该以提升的权限运行(右键单击该快捷方式并select以pipe理员身份运行或设置mintty快捷方式属性, 高级→以pipe理员身份运行 )。

特别感谢Guria和Spooky的贡献。

接受的答案是正确的,两个小旁注。

如果您只关心在命令行中创build的符号链接,请安装cygutils-extra软件包,它包含一个winln命令,该命令与ln语法相同,但创build本机Windows链接。 创build一个别名: alias ln=winln (仅在交互式shell中工作),或者甚至用winlnreplaceln文件(也可以在shell脚本中工作) – 但是下次更新coreutils软件包时可能会被覆盖。

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

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

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

审查links 。 创build一个包含所有链接的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 ,但后来我发现,在这种模式下,如果target不存在, ln -s target link失败。 相比之下, native将创build一个指向不存在的target的Cygwin(非本地)符号link – 这与UNIX系统上的ln行为相匹配。 在极less数情况下, nativestrict可能会破坏一些程序或脚本,例如Gentoo run-crons脚本使用一个run-crons文件,它是一个指向正在运行的进程的PID的符号链接。 在nativestrict模式下,脚本停止工作,因为它不能再创build锁文件。 注意: run-crons是Gentoo Linux上的一个crontab助手脚本,增加了对cron.{hourly,daily,weekly,monthly}/ dirs的支持,它在Cygwin中运行得非常好。

由于@olibre答案不适合我。 我刚刚创build了一个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 } 

请注意,您需要pipe理员权限(对于Cygwin)来运行上述没有问题。

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

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

 cd "/drive_letter/SubCatalogue/SubFolder/..."