在Mac OS X中复制符号链接

37

在Mac上复制符号链接的最简单方法是什么?

最好使用Python或Perl解决方案,但任何解决方案都会有所帮助。

我正在为一个安装包复制框架,并需要保持链接。


非常抱歉,作为一名Python/Perl开发人员,我没有意识到cp命令可以如此简单地完成这项工作。不过,我相信标题确切地说明了我的意图。 - David Sykes
4个回答

52

正如 David 所提到的,OS X 缺少 gnu cp 中有用的 -a 选项。

但是,如果您使用 -R 进行递归复制,则默认情况下它将复制符号链接,因此

cp -R source destination

应该正常工作。


3
现在,OS X 支持 -a 选项。 - Oded Regev

11

@brian d foy 的解决方案曾经是正确的。较新版本的 macOS 确实支持。

cp -a

1
在macOS(High Sierra)中,cp -a不会保留硬链接,只能保留符号链接。 - msc

3
在Python中,您可以使用 os.readlinkos.symlink 来执行此操作。您应该使用 os.lstatstat.S_ISLNK 检查您要操作的是否实际上是符号链接。
import os, stat
if stat.S_ISLNK(os.lstat('foo').st_mode):
    src = os.readlink('source')
    os.symlink(src, 'destination')

您可以使用 cp命令的-R选项 完成此操作。默认情况下,cp不会跟随符号链接,但是会在未指定递归(-R)时警告非文件复制。
cp -R source destination

在Python中,可以使用subprocess.call实现。
from subprocess import call
call(['cp', '-R', 'source', 'destination'])

请注意,macosx alias不是符号链接,因此符号链接特定的处理将无法对其起作用。

1
上面的macosx别名链接已经失效。 - pre-kidney

0

由于你标记了Python,我假设你的意思是类似于copytree(src, dst[, symlinks])。在任何Unix系统上,真正的符号链接(通过ln -s创建)将被复制。但是如果你使用Finder创建别名,你得到的不是一个符号链接,而是一个别名。MacOS提供了两种链接类型:Unix类型符号链接和别名(参见http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/Articles/Aliases.html)。许多工具都不会将这些别名视为链接,包括我所知道的copytree。


我打了Python的标签,因为它是我喜欢的脚本语言,但事实证明cp也可以很简单地完成工作,谢谢。 - David Sykes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接