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

yebdmbv4  于 2023-03-09  发布在  Windows
关注(0)|答案(4)|浏览(290)

我的Linux机器中有一个符号链接。
我只想将符号链接(而不是目标)复制到Windows计算机,然后将此符号链接从Windows计算机复制回其他Linux计算机,符号链接应继续工作。
我尝试了:
1.我压缩了符号链接
1.使用WinSCP将gzip文件移动到Windows计算机
1.提取的符号链接
1.使用WinSCP将符号文件移动到Linux机器
现在这个文件不再是符号链接了。
有人知道怎么做吗?

ndasle7k

ndasle7k1#

在 * nix中,符号链接通常只是一个带有"symlink"属性的纯文本文件。该文件包含链接目标的路径。"symlink"属性在Windows上不存在。因此,当您在Windows上解压缩符号链接时,它将成为一个常规文本文件[尽管它也可能出错,但可能取决于您用于解压缩归档文件的工具]。当复制回 * nix时,它仍将是一个常规文本文件。
唯一的解决方案是将"symlink"属性保存在某个外部元数据存储中,并在上载文件或创建归档时恢复该属性。
尽管我不知道有什么工具支持这个。
你绝对可以编码这个。
1.* * 使用WinSCP**:您编写了一个生成WinSCP script的代码。该代码将递归地迭代本地目录结构。对于文件,它将生成put命令来上载它。对于符号链接,它将生成ln命令来创建符号链接。要区分符号链接,你也许可以用一个简单的启发法(符号链接=带有斜线的单行文本文件)。正确的方法是在解压缩归档文件时记住文件符号链接属性(但是您也必须自己编写提取代码,另请参见下面的提示)。
1.* * 使用存档**:我最近为一个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示例一样。

o3imoua4

o3imoua42#

我试着把链接文件保存在gzip(或tar.gz)存档中,并且只在另一个linux系统上解压缩它,我知道windows通常不能很好地处理linux文件的属性和权限,在windows上解压缩链接可能会改变它。
或者,在新的linux系统上重新创建符号链接应该很容易,可以使用自动化脚本,也可以将定制的ln行复制并粘贴到终端中,例如

#!/bin/bash
ln -s TARGET LINKNAME

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

bn31dyow

bn31dyow3#

1.使用虚拟盒

您可以使用VirtualBox和rsync,或者将tar归档文件解压缩到Windows主机(NTFS)共享文件夹中。

VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

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

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

或者,你可以使用Windows Subsystem for Linux (WSL)将tar压缩文件解压到NTFS分区,这样可以保留符号链接,你也可以重新解压这些链接,然后将tar压缩文件复制到你喜欢的系统。
不过,到目前为止WSL仅在64位版本的Windows 10上可用,可以在Windows 10周年更新及更高版本上激活,另请注意,目前(2018-01-21)the date of files is not restored correctly.

wb1gzix0

wb1gzix04#

我在尝试安装一个压缩的linux Matlab试用版时发现了这个线程。它没有设置执行位,库的符号链接变成了ascii文件。似乎没有命令来恢复文件权限中的l位,所以我写了这个脚本:#!/用户名/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`

相关问题