为Cygwin启用本地NTFS符号链接
最近的NTFS和Windows实现符号链接:
- 自NTFS 3.0(Windows 2000)使用
linkd
或junction
工具以来, 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)使用
linkd
或junction
工具以来, NTFS联结点可用作目录符号链接。 - 自Windows Vista使用
mklink
工具以来, NTFS符号链接也可以用作符号链接(用于文件和目录)。
Cygwin可以创build本地NTFS符号链接
Cygwin文档的简化提取:
符号链接
[…]
Cygwin可能以多种不同的方式创build符号链接:
默认的符号链接是纯文件,其中包含一个魔术cookies,后面跟着链接指向的path。 […]
如果环境variablesCYGWIN […]设置为包含string
winsymlinks
或winsymlinks:lnk
创build快捷方式符号链接为Windows.lnk
[…]。 […]本机Windows符号链接仅在Windows Vista / 2008和更高版本上创build,并且仅在支持重新分析点的文件系统上创build。 由于他们奇怪的限制和行为,只有当用户明确要求创build它们时才会创build它们。 这是通过将环境variablesCYGWIN设置为包含string
winsymlinks:native
或winsymlinks: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:native
或winsymlinks:nativestrict
,则Cygwin将创build符号链接作为支持文件系统和操作系统版本的本机Windows符号链接。 如果已知操作系统不支持本机符号链接(Windows XP,Windows Server 2003),则每个会话将产生一次警告消息。
winsymlinks:native
和winsymlinks: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中工作),或者甚至用winln
replaceln
文件(也可以在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/..."