簡體   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