如何将符号链接文件从Linux复制到Windows,然后再复制回Linux,但仍将其保留为符号链接

Bhu*_*van 5 linux windows symlink gzip winscp

我的Linux机器中有一个符号链接。

我只想将符号链接(而非目标)复制到Windows机器,然后将该符号链接从Windows机器复制回其他Linux机器,并且该符号链接应继续工作。

我试过的

  1. 我压缩了符号链接
  2. 使用WinSCP将压缩文件移至Windows计算机
  3. 提取的符号链接
  4. 使用WinSCP将符号文件移动到Linux计算机

现在,此文件不再是符号链接。

有人知道这样做的窍门吗?

Mar*_*ryl 5

在 *nix 中,符号链接通常只是带有“符号链接”属性的纯文本文件。该文件包含链接目标的路径。Windows 上不存在“符号链接”属性。因此,当您在 Windows 上提取符号链接时,它会变成一个常规文本文件 [尽管它也可能出错,它可能取决于您用来提取存档的工具]。当复制回 *nix 时,它仍然是一个普通的文本文件。

唯一的解决方案是将“符号链接”属性保留在某些外部元数据存储中,并在上传文件或创建存档时恢复该属性。

尽管我不知道有任何支持此功能的工具。

你绝对可以编码这个。

  1. 使用 WinSCP:您编写生成WinSCP 脚本的代码。该代码将递归迭代本地目录结构。对于文件,它将生成put上传命令。对于符号链接,它将生成ln创建符号链接的命令。要区分符号链接,您可以仅使用简单的启发式方法(符号链接 = 带斜杠的短单行文本文件)。一种正确的方法是在提取存档时记住文件符号链接属性(但您也必须自己编写提取代码,另请参阅下面的提示)。

  2. 使用存档:我最近为 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);
    
    Run Code Online (Sandbox Code Playgroud)

    如果您更熟悉 Python,请参阅如何使用 Python 的 zipfile 模块在 ZIP 文件中的文件上设置权限(属性)?它仅处理权限,但您可以根据我的 PHP 示例使用符号链接位轻松扩展它。