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

时间:2014-04-30 05:21:14

标签: linux windows gzip symlink winscp

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

我想将符号链接(不是目标)复制到Windows机器,然后将此符号链接从Windows机器复制回其他Linux机器,符号链接应继续工作。

我尝试了什么:

  1. 我gziped符号链接
  2. 使用WinSCP将gzip压缩文件移至Windows计算机
  3. 提取的符号链接
  4. 使用WinSCP将符号文件移动到Linux计算机
  5. 现在这个文件不再是符号链接了。

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

3 个答案:

答案 0 :(得分:4)

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

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

虽然我不知道任何支持此功能的工具。

你绝对可以编码。

  1. 使用WinSCP :您创建的代码生成WinSCP script。代码将递归迭代本地目录结构。对于文件,它将生成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);
    

    如果您对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)

1。使用VirtualBox

您可以使用VirtualBox和rsync或将tar存档提取到Windows主机(NTFS)共享文件夹中。但是,您需要先{/ 3}}通过

VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

并且您的帐户可能不是管理员帐户,以便拥有创建链接的权限。

2。使用Windows的Linux子系统(WSL)

或者,您可以使用activate the creation of symbolic links将tar存档解压缩到NTFS分区。它将保留符号链接。您还可以再次tar这些链接并将tar存档复制到您喜欢的系统。

但是,到目前为止,WSL仅适用于Windows 10的64位版本,可以在Windows 10周年更新及更高版本上激活。另请注意,目前(2018-01-21)Windows Subsystem for Linux (WSL)