我希望将文件src
复制到目标dst
,但如果src
恰好是一个符号链接,请保留该链接,而不是复制文件的内容。执行复制后,os.readlink
应为src
和dst
返回相同的值。
模块shutil
有几个函数,比如copyfile
、copy
和copy2
,但是所有这些函数都会复制文件的内容,并且不会保留链接。除了删除原始文件之外,shutil.move
具有正确的行为。
Python中有没有一种内置的方法,可以在保留符号链接的同时执行文件复制?
发布于 2019-03-25 16:17:34
Python 3 follow_symlinks
在Python3中,shutil
的大多数复制方法都学习了follow_symlinks
参数,如果选择该参数,该参数将保留符号链接。
例如,对于shutil.copy
shutil.copy(src, dest, follow_symlinks=False)
shutil.copy(源、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
上,所以我最终改用:
#!/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中测试。
发布于 2011-01-31 12:33:47
只管去做
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指出的那样,它在只复制目录而不是单个文件时很挑剔。
https://stackoverflow.com/questions/4847615
复制相似问题