检查cygwin中符号链接类型的差异

joh*_*nyB 5 symlink cygwin

我使用 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:nativeCYGWIN=winsymlinks:nativestrict但在一些软件包安装期间(主要使用apt-cyg),我在一些软件包的提取 TAR 中遇到了错误,所以我将其遗漏了,只在需要时调用 CYGWIN=winsymlinks:native (如果Windows 需要点击链接)。我认为这些软件包是从初始 CYGWIN setup.exe 作为 cygwin 符号链接安装的,因此全局设置该值将在以后产生问题。我还使用 CYGWIN=winsymlinks:nativestrict 设置创建了一个实际的“/usr/bin/”文件夹(可以在资源管理器中看到),但 cygwin 将 /bin 安装为 /usr/bin,因此您可以提取在中找不到的包西格温。

而且也只是因为有一些符号链接我不想让Windows知道或遵循。

joh*_*nyB 5

我最终编写了这个脚本。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)