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

问题描述 投票:0回答:4

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

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

我尝试了什么:

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

现在这个文件不再是符号链接了。

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

linux windows gzip symlink winscp
4个回答
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);
    

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


3
投票

我会尝试将链接文件保存在 gzip(或 tar.gz)存档中,并且只在另一个 linux 系统上解压缩它。我知道 Windows 通常不能很好地处理 Linux 文件属性和权限,并且在 Windows 上提取链接可能会以某种方式改变它。

或者在新的 linux 系统上重新创建符号链接应该很容易,无论是在自动脚本中还是只是将您的自定义

ln
行复制并粘贴到终端中,例如

#!/bin/bash
ln -s TARGET LINKNAME

这些都是假设您的新 linux 系统在与原始 linux 系统相同的位置具有相同的目标文件。


0
投票

1。使用 VirtualBox

您可以使用 VirtualBox 和 rsync 或将 tar 存档提取到 Windows 主机 (NTFS) 共享文件夹中。但是,您需要先通过激活符号链接的创建

VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

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

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

或者,您可以使用 适用于 Linux 的 Windows 子系统 (WSL) 将您的 tar 存档提取到 NTFS 分区。它将保留符号链接。您也可以再次对这些链接进行压缩,并将压缩包复制到您喜欢的系统中。

不过,到目前为止,WSL 仅适用于 64 位版本的 Windows 10,并且可以在 Windows 10 Anniversary Update 及更高版本上激活。另请注意,目前(2018-01-21)文件的日期未正确恢复.


0
投票

我在尝试安装压缩的 Linux Matlab 试用版时发现了这个线程。它没有设置执行位,库的符号链接变成了 ascii 文件。 似乎没有命令来恢复文件权限中的 l 位,所以我写了这个脚本: #! /usr/bin/bash

for i in `ls -1 lib*.so*`
do
 # find the broken symlinks
    if file -b --mime-encoding ${i} |grep -q ascii
 # cat the broken link and use it as the ln target
        then ln -sf `cat ${i}` ${i}
    else
        chmod 0755 ${i}
    fi
    done`
© www.soinside.com 2019 - 2024. All rights reserved.