我的Linux机器中有一个符号链接。我只想将符号链接(而不是目标)复制到Windows计算机,然后将此符号链接从Windows计算机复制回其他Linux计算机,符号链接应继续工作。我尝试了:1.我压缩了符号链接1.使用WinSCP将gzip文件移动到Windows计算机1.提取的符号链接1.使用WinSCP将符号文件移动到Linux机器现在这个文件不再是符号链接了。有人知道怎么做吗?
ndasle7k1#
在 * nix中,符号链接通常只是一个带有"symlink"属性的纯文本文件。该文件包含链接目标的路径。"symlink"属性在Windows上不存在。因此,当您在Windows上解压缩符号链接时,它将成为一个常规文本文件[尽管它也可能出错,但可能取决于您用于解压缩归档文件的工具]。当复制回 * nix时,它仍将是一个常规文本文件。唯一的解决方案是将"symlink"属性保存在某个外部元数据存储中,并在上载文件或创建归档时恢复该属性。尽管我不知道有什么工具支持这个。你绝对可以编码这个。1.* * 使用WinSCP**:您编写了一个生成WinSCP script的代码。该代码将递归地迭代本地目录结构。对于文件,它将生成put命令来上载它。对于符号链接,它将生成ln命令来创建符号链接。要区分符号链接,你也许可以用一个简单的启发法(符号链接=带有斜线的单行文本文件)。正确的方法是在解压缩归档文件时记住文件符号链接属性(但是您也必须自己编写提取代码,另请参见下面的提示)。1.* * 使用存档**:我最近为一个ZIP压缩包实现了这个功能。(甚至在Windows上)你可以使用PHP方法ZipArchive::setExternalAttributes将一个压缩文件标记为一个符号链接。注意这个函数只在PHP 5.6以后才可用。样本代码:
put
ln
ZipArchive::setExternalAttributes
$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示例一样。
o3imoua42#
我试着把链接文件保存在gzip(或tar.gz)存档中,并且只在另一个linux系统上解压缩它,我知道windows通常不能很好地处理linux文件的属性和权限,在windows上解压缩链接可能会改变它。或者,在新的linux系统上重新创建符号链接应该很容易,可以使用自动化脚本,也可以将定制的ln行复制并粘贴到终端中,例如
#!/bin/bash ln -s TARGET LINKNAME
这些都是假设您的新Linux系统在与原始Linux系统相同的位置具有相同的目标文件。
bn31dyow3#
您可以使用VirtualBox和rsync,或者将tar归档文件解压缩到Windows主机(NTFS)共享文件夹中。
VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1
并且您的帐户可能不是管理员帐户才能具有创建链接的权限。
或者,你可以使用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.
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`
4条答案
按热度按时间ndasle7k1#
在 * nix中,符号链接通常只是一个带有"symlink"属性的纯文本文件。该文件包含链接目标的路径。"symlink"属性在Windows上不存在。因此,当您在Windows上解压缩符号链接时,它将成为一个常规文本文件[尽管它也可能出错,但可能取决于您用于解压缩归档文件的工具]。当复制回 * nix时,它仍将是一个常规文本文件。
唯一的解决方案是将"symlink"属性保存在某个外部元数据存储中,并在上载文件或创建归档时恢复该属性。
尽管我不知道有什么工具支持这个。
你绝对可以编码这个。
1.* * 使用WinSCP**:您编写了一个生成WinSCP script的代码。该代码将递归地迭代本地目录结构。对于文件,它将生成
put
命令来上载它。对于符号链接,它将生成ln
命令来创建符号链接。要区分符号链接,你也许可以用一个简单的启发法(符号链接=带有斜线的单行文本文件)。正确的方法是在解压缩归档文件时记住文件符号链接属性(但是您也必须自己编写提取代码,另请参见下面的提示)。1.* * 使用存档**:我最近为一个ZIP压缩包实现了这个功能。(甚至在Windows上)你可以使用PHP方法
ZipArchive::setExternalAttributes
将一个压缩文件标记为一个符号链接。注意这个函数只在PHP 5.6以后才可用。样本代码:
如果您更熟悉Python,请参阅How do I set permissions (attributes) on a file in a ZIP file using Python's zipfile module?它只处理权限,但您可以轻松地使用符号链接位对其进行扩展,就像我的PHP示例一样。
o3imoua42#
我试着把链接文件保存在gzip(或tar.gz)存档中,并且只在另一个linux系统上解压缩它,我知道windows通常不能很好地处理linux文件的属性和权限,在windows上解压缩链接可能会改变它。
或者,在新的linux系统上重新创建符号链接应该很容易,可以使用自动化脚本,也可以将定制的
ln
行复制并粘贴到终端中,例如这些都是假设您的新Linux系统在与原始Linux系统相同的位置具有相同的目标文件。
bn31dyow3#
1.使用虚拟盒
您可以使用VirtualBox和rsync,或者将tar归档文件解压缩到Windows主机(NTFS)共享文件夹中。
并且您的帐户可能不是管理员帐户才能具有创建链接的权限。
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.
wb1gzix04#
我在尝试安装一个压缩的linux Matlab试用版时发现了这个线程。它没有设置执行位,库的符号链接变成了ascii文件。似乎没有命令来恢复文件权限中的l位,所以我写了这个脚本:#!/用户名/bin/bash