如何通过命令行正确复制Cygwin环境下的符号链接文件?
Cygwin命令行复制符号链接为空的原因及解决方法
原因分析
问题核心在于Cygwin符号链接的类型差异与Windows资源管理器的处理逻辑不同:
- Cygwin默认模拟符号链接:默认情况下,Cygwin创建的符号链接并非Windows原生符号链接,而是用快捷方式(.lnk文件)或纯文本文件存储链接路径的模拟链接。
- Windows资源管理器会自动识别这类模拟链接(快捷方式),复制时直接跳转至链接指向的目标文件,因此你看到的是正常内容。
- 而Cygwin的
cp或tar命令若使用-P(保留链接)参数,复制的是模拟链接本身(即.lnk或文本文件),在Windows目录下打开时仅显示空内容或链接路径文本,导致你误以为复制出空文件。
- 跟随链接参数的路径解析问题:当使用
cp -L(跟随链接)参数时,如果符号链接内的路径是Cygwin风格的相对路径或虚拟路径,复制到Windows原生目录(/cygdrive/c/...)时,Cygwin可能无法正确解析路径,最终复制出空内容。
解决方法
根据你的实际需求选择对应方案:
方案1:复制符号链接指向的实际内容
若目标是复制链接对应的文件内容而非链接本身:
- 切换到源目录后,使用
-L参数强制跟随链接执行复制:cd /cygdrive/c/cygwin/dev cp -RLv * /cygdrive/c/dest/folder/ - 注意:如果链接是相对路径,需保证复制时的工作目录与链接创建时一致,避免路径解析失败。
方案2:复制Windows原生符号链接本身
若需要在目标目录保留符号链接(而非内容):
- 以管理员身份启动Cygwin(Windows原生符号链接需要管理员权限)。
- 设置Cygwin使用原生符号链接:启动前设置环境变量
CYGWIN="winsymlinks:native",或修改Cygwin的/etc/profile文件添加该变量。 - 重新创建源目录的符号链接(确保为原生类型),再用
-P参数复制:
此时复制出的是Windows原生符号链接,在资源管理器和命令行下都能正常识别。cp -PRv /cygdrive/c/cygwin/dev/* /cygdrive/c/dest/folder/
方案3:用tar命令正确处理符号链接
如需用tar命令操作,可根据需求选择参数:
- 复制链接指向的内容:
tar cvf --dereference - . | (cd /cygdrive/c/dest/folder/ && tar xvf -) - 保留原生符号链接(需管理员权限):
tar cvfh - . | (cd /cygdrive/c/dest/folder/ && tar xvf -)
内容的提问来源于stack exchange,提问作者Jérôme G
相关产品推荐
相关产品推荐

