我的Linux机器上有一个符号链接。
我想将符号链接(不是目标)复制到Windows机器,然后将此符号链接从Windows机器复制回其他Linux机器,符号链接应继续工作。
我尝试了什么:
现在这个文件不再是符号链接了。
有人知道这样做的诀窍吗?
答案 0 :(得分:4)
在* nix中,符号链接通常只是一个纯文本文件,带有"符号链接"属性。该文件包含链接目标的路径。 "符号链接" Windows上不存在该属性。因此,当您在Windows上提取符号链接时,它将成为常规文本文件[虽然它也可能出错,但它可能取决于您用来提取存档的工具]。复制回* nix时,它会保留常规文本文件。
唯一的解决方案是保持"符号链接"某些外部元数据存储中的属性,并在上载文件或创建存档时恢复该属性。
虽然我不知道任何支持此功能的工具。
你绝对可以编码。
使用WinSCP :您创建的代码生成WinSCP script。代码将递归迭代本地目录结构。对于文件,它将生成put
命令以上载它。对于符号链接,它将生成ln
命令以创建符号链接。为了区分符号链接,您可以使用一个简单的启发式方法(符号链接=带有斜杠的简短单行文本文件)。一种正确的方法是在提取存档时记住文件符号链接属性(但是你也必须自己编写提取代码,请参阅下面的提示)。
使用存档:
我最近为ZIP存档实现了这个。 (即使在Windows上)您可以使用PHP方法ZipArchive::setExternalAttributes
将存档文件标记为符号链接。请注意,该功能仅适用于PHP 5.6。
示例代码:
$symlink = true; // is symlink?
$dir = false; // is folder?
$mode = "755"; // permissions
$local_path = "C:\\zip\\folder\\mylink";
$zip_path = "folder/mylink";
$attr =
(1 << 14) | // this bit seems to be always set
(1 << ($dir ? 30 : 31)) |
($symlink ? (1 << 29) : 0) |
octdec($mode) << 16;
$zip->addFile($local_path, $zip_path);
$zip->setExternalAttributesName($zip_path, ZipArchive::OPSYS_UNIX, $attr);
如果您对Python更熟悉,请参阅How do I set permissions (attributes) on a file in a ZIP file using Python's zipfile module?它仅处理权限,但根据我的PHP示例,您可以使用符号链接位轻松扩展它。
答案 1 :(得分:3)
我尝试将链接文件保存在gzip(或tar.gz)存档中,并仅在另一个Linux系统上提取它。我知道Windows通常不会处理linux文件属性和&amp;权限很好,并在Windows上提取链接可能会以某种方式改变它。
或者在新的Linux系统上重新创建符号链接应该很容易,无论是在自动脚本中还是只是复制和放大。将自定义ln
行粘贴到终端中,例如
#!/bin/bash
ln -s TARGET LINKNAME
这些都假设你的新linux系统与原始linux系统在同一个地方有相同的目标文件。
答案 2 :(得分:0)
您可以使用VirtualBox和rsync或将tar存档提取到Windows主机(NTFS)共享文件夹中。但是,您需要先{/ 3}}通过
VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1
并且您的帐户可能不是管理员帐户,以便拥有创建链接的权限。
或者,您可以使用activate the creation of symbolic links将tar存档解压缩到NTFS分区。它将保留符号链接。您还可以再次tar这些链接并将tar存档复制到您喜欢的系统。
但是,到目前为止,WSL仅适用于Windows 10的64位版本,可以在Windows 10周年更新及更高版本上激活。另请注意,目前(2018-01-21)Windows Subsystem for Linux (WSL)。