繁体   English   中英

在Python中复制符号链接

[英]Copying a symbolic link in Python

我想将文件src复制到目标dst ,但如果src恰好是符号链接,则保留链接而不是复制文件的内容。 执行复制后, os.readlink应为srcdst返回相同的内容。

模块shutil有几个函数,例如copyfilecopycopy2 ,但所有这些函数都将复制文件的内容 ,并且不会保留链接。 shutil.move具有正确的行为,除了它删除原始文件的事实。

在保留符号链接的同时,Python中是否有内置的方法来执行文件复制?

做就是了

def copy(src, dst):
    if os.path.islink(src):
        linkto = os.readlink(src)
        os.symlink(linkto, dst)
    else:
        shutil.copy(src,dst)

shutil.copytree做了类似的事情,但正如发送者指出的那样,只复制目录而不是单个文件是挑剔的。

Python 3 follow_symlinks

在Python 3中, shutil大多数复制方法都学习了follow_symlinks参数,如果选择了该参数,它会保留符号链接。

例如,对于shutil.copy

shutil.copy(src, dest, follow_symlinks=False)

并且文档说

 shutil.copy(src, dst, *, follow_symlinks=True) 

将文件src复制到文件或目录dst。 src和dst应该是字符串。 如果dst指定目录,则使用src中的基本文件名将文件复制到dst中。 返回新创建文件的路径。

如果follow_symlinks为false,并且src是符号链接,则dst将创建为符号链接。 如果follow_symlinks`为true且src是符号链接,则dst将是src引用的文件的副本。

但是这有一个问题:如果您尝试覆盖现有文件或符号链接,它将失败:

FileExistsError: [Errno 17] File exists: 'b' -> 'c'

follow_symlinks=True ,成功覆盖。

对于os.symlink也是os.symlink ,所以我最终使用了:

#!/usr/bin/env python3

import shutil
import os

def copy(src, dst):
    if os.path.islink(src):
        if os.path.lexists(dst):
            os.unlink(dst)
        linkto = os.readlink(src)
        os.symlink(linkto, dst)
    else:
        shutil.copy(src, dst)

if __name__ == '__main__':
    os.symlink('c', 'b')
    os.symlink('b', 'a')
    copy('a', 'b')

    with open('c', 'w') as f:
        f.write('a')
    with open('d', 'w'):
        pass
    copy('c', 'd')
    copy('a', 'c')

在Ubuntu 18.10,Python 3.6.7中测试过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM