首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中复制符号链接

在Python中复制符号链接
EN

Stack Overflow用户
提问于 2011-01-31 12:24:42
回答 2查看 20.7K关注 0票数 25

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

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

Python中有没有一种内置的方法,可以在保留符号链接的同时执行文件复制?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-25 16:17:34

Python 3 follow_symlinks

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

例如,对于shutil.copy

代码语言:javascript
复制
shutil.copy(src, dest, follow_symlinks=False)

the docs say

shutil.copy(源、dst、*、follow_symlinks=True)

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

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

但是,这有一个问题:如果您尝试覆盖现有文件或符号链接,则会失败,并显示以下错误:

代码语言:javascript
复制
FileExistsError: [Errno 17] File exists: 'b' -> 'c'

与成功覆盖的follow_symlinks=True不同。

同样的情况也发生在os.symlink上,所以我最终改用:

代码语言:javascript
复制
#!/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中测试。

票数 7
EN

Stack Overflow用户

发布于 2011-01-31 12:33:47

只管去做

代码语言:javascript
复制
def copy(src, dst):
    if os.path.islink(src):
        linkto = os.readlink(src)
        os.symlink(linkto, dst)
    else:
        shutil.copy(src,dst)

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

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4847615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档