[英]Copying a symbolic link in Python
我想將文件src
復制到目標dst
,但如果src
恰好是符號鏈接,則保留鏈接而不是復制文件的內容。 執行復制后, os.readlink
應為src
和dst
返回相同的內容。
模塊shutil
有幾個函數,例如copyfile
, copy
和copy2
,但所有這些函數都將復制文件的內容 ,並且不會保留鏈接。 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.