我根据需要和可行性使用winsymlinks:native和cygwin符号链接。我希望有一种cygwin的方法可以查看它是哪种符号链接,因为它只看到一个符号链接,但DOS看到了不同之处。我需要知道差异,以便处理rsync等,并保留(或重新创建)符号链接的类型。
我有权限创建dos本地符号链接并有设置任一的功能:
$ touch test
# cygwin style symlink
$ CYGWIN= ln -s test t1
# WINDOWS style
$ CYGWIN=winsymlinks:native ln -s test t2
# for good measure make one the DOS way
$ cmd /c mklink t3 test
symbolic link created for t3 <<===>> test
cygwin 将它们全部视为符号链接:
$ ls -l
total 1
lrwxrwxrwx 1 user Users 4 Jun 14 11:06 t1 -> test
lrwxrwxrwx 1 user Users 4 Jun 14 11:06 t2 -> test
lrwxrwxrwx 1 user Users 4 Jun 14 11:06 t3 -> test
-rw-rw-rw-+ 1 user Users 0 Jun 14 11:05 test
Windows知道本地符号链接:
或者从DOS中看到:
$ cmd /c dir /a
Volume in drive C is Windows
Directory of C:\Cygwin-32\tmp
06/14/2014 11:06 AM 22 t1
06/14/2014 11:06 AM <SYMLINK> t2 [test]
06/14/2014 11:06 AM <SYMLINK> t3 [test]
06/14/2014 11:05 AM 0 test
4 File(s) 22 bytes
那么,在CYGWIN中查看符号链接时,我该如何确定它是哪种类型的?当我使用rsync同步这些符号链接时,CYGWIN会在目标位置创建与环境变量中设置的相同类型的符号链接。我希望保留rsync'd目标中的符号链接类型,或者至少浏览源文件夹,找出其类型并在目标位置更改它们。
stat
仅将它们报告为符号链接,并不知道其中的区别。
添加此部分,因为我讨厌“你为什么需要(或想要)那样做?”的答案:
为什么我要混合使用符号链接?我尝试将我的整体CYGWIN环境变量设置为CYGWIN=winsymlinks:native
和CYGWIN=winsymlinks:nativestrict
,但在某些软件包安装期间(主要使用apt-cyg
),我在一些软件包的提取TAR中遇到了错误,所以我将其排除在外,并且只在需要时调用CYGWIN=winsymlinks:native(如果Windows需要跟随链接)。我认为软件包从最初的CYGWIN setup.exe安装为cygwin符号链接,因此全局设置该值将在以后创建问题。我也曾经将CYGWIN=winsymlinks:nativestrict设置为实际创建了一个“/usr/bin/”文件夹(可以在资源管理器中看到),但是cygwin将/bin挂载为/usr/bin,因此您会提取找不到的cygwin软件包。还有一些符号链接,我不希望Windows知道或跟随。
native
模式的一个奇怪问题是,如果您尝试创建指向不存在文件的符号链接(在某些情况下这是有意义的),Cygwin 会创建一个 Cygwin(非本地)符号链接。如果您使用nativestrict
模式并尝试执行此操作,则ln
将返回错误并无法创建任何类型的链接。因此,我从nativestrict
切换到了native
。 - Gene Pavlovsky