给定两个具有相同内容的路径:
D:\dir1\file1
D:\dir1\symlink1-to-file1
D:\dir2\file1
D:\dir2\symlink1-to-file1
如果我D:\dir2\symlink1-to-file1
通过从 Windows 复制来创建D:\dir1\symlink1-to-file1
,则链接将不起作用,并且file
命令将输出:
D:\dir2\symlink1-to-file1: data
为什么 ?
答案1
这不是 Cygwin 中的错误,而是 Windows 资源管理器的复制/粘贴功能中的错误
- 移动文件夹将保持符号链接原样
- 复制/粘贴符号链接将破坏符号链接
并且这种情况cmd /C mklink
不仅发生在使用 cygwin创建的符号链接上
对此,几乎没有解决方案: Windows 7 / 符号链接 - 如何将符号链接复制到目录?
解决方案:
- 下载 链接外壳扩展
- 运行“C:\Program Files\LinkShellExtension\LSEConfig.exe”并将“外部连接/符号链接”设置更改为“Splice”。
- 右键单击要复制的文件夹,然后单击“选择链接源”
- 要粘贴文件夹,请单击“作为:智能复制”或镜像。
CLI 解决方案:
我发现只有两种可行的解决方案:
ln——命令行硬链接
这不是ln
你所知道的 cygwin 中的,而是其他的东西,由同一个创建者制作Link Shell Extension
,从下载这里
ln.exe --splice --backup --mirror source_dir destination_dir
斯特拉克
关联,这是由著名的 ImDisk 的同一个创建者制作的,并且受到大多数人的推荐
strarc 可用于将完整的目录树从一个 NTFS 卷复制到另一个 NTFS 卷,包括 NTFS 的所有特殊属性,如安全信息、权限、所有权、审计设置等。
假设您有一个名为 的目录C:\dir
,并且您想将其复制到D:\dirbk
。由于 strarc 默认将存档到 stdout 并从 stdin 中提取,因此您可以输入以下内容:
strarc -cjd:C:\dir | strarc -xd:D:\dirbk -w:8
Windows 2000 及更高版本中的 NTFS 有一个选项,用于创建空目录的“重新解析点”。该实现涉及一个“重新解析数据块”,它指定哪个文件系统过滤器应该处理重新解析点,以及一些有关特定重新解析点应该做什么的过滤器参数。Windows 2000 本身支持例如“连接点”和“远程存储”类型的重新解析点。“连接点”类型实际上是指向另一个本机路径的链接,非常类似于 Unix 文件系统上目录路径的符号链接。卷挂载点目录使用此方法使挂载点目录实际重定向到目标文件系统。备份具有重新解析点的文件系统时,您有两个选择。如果没有特殊开关,strarc 会像普通应用程序一样遵循重新解析点。在许多情况下,这可能是您想要的,但如果您要存档的目录树有例如指向树中连接点上方的目录的连接点(形成无限深的目录树)或指向其他文件系统的连接点等,您可能希望备份重新解析点本身,而不是它们指向的目录。要选择第二种方法,请使用 strarc 的 -j 开关。
同步
众所周知,cygwin 中的 rsync 不是一个解决方案,因为它将符号链接更改为不同的东西,请阅读这篇关于符号链接如何在 cygwin 中工作的精彩文章文章
Robocopy
Robocopy 通常用于此目的,并且很多文章都建议使用,但很少有人知道 robocopy 充满了错误,不应该使用:
- 严肃的robocopy 漏洞(robocopy 容易受到符号链接攻击)关联
- 当同时使用 /sl 和 /b 时,robocopy 不会创建符号链接,当再次调用时,它将再次复制至少一个文件的标志关联
- Robocopy 损坏重复数据删除卷关联
谁会想到像复制文件夹这样简单的事情需要所有这些......
答案2
使用CMD命令检查文件属性attrib
https://cygwin.com/cygwin-ug-net/using.html#pathnames-symlinks
如果默认的纯文件符号链接类型缺少其 DOS SYSTEM 位,或者快捷方式文件缺少 DOS READONLY 属性,则它们不会被识别为符号链接。