我使用 winsymlinks:native 和 cygwin 符号链接,具体取决于 Windows 是否需要并且可以跟踪链接。我想要一种 cygwin 的方式来查看它是什么类型的符号链接,因为它只看到符号链接,但 DOS 看到差异。我需要知道差异,以便我可以处理 rsyncing/etc/ 并保留(或重新创建)符号链接的类型。
我拥有创建 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
那么在 CYGWIN 中查看时如何判断它是什么类型的符号链接呢?当我 rsync 这些符号链接时,cygwin 会将所有符号链接设置为 CYGWIN 环境变量中设置的类型。我想将符号链接类型保留在 rsync 目的地中,或者至少浏览源文件夹,找出类型并在目的地更改它们。 stat也只将它们报告为符号链接,看不到区别。
添加此部分是因为我讨厌“为什么需要(或想要)这样做?” 答案:
为什么我要混合符号链接?我尝试将我的总体 CYGWIN env var 设置为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,因此您可以提取在中找不到的包西格温。
而且也只是因为有一些符号链接我不想让Windows知道或遵循。
我最终编写了这个脚本。cygwin 中的测试是调用 dos 命令和 grep 来获取所需的信息。
if fsutil reparsepoint query "$1" | grep -iq "Tag value: Symbolic Link" ; then
echo "Windows Native Symlink"
fi
Run Code Online (Sandbox Code Playgroud)