2011-01-31 20 views
21

Voglio copiare un file src nella destinazione dst, ma se è un collegamento simbolico, conservare il collegamento anziché copiare il contenuto del file. Dopo aver eseguito la copia, os.readlink deve restituire lo stesso per src e dst.Copia di un collegamento simbolico in Python

Il modulo shutil ha diverse funzioni, come ad esempio copyfile, copy e copy2, ma tutti questi copierà i contenuti del file, e non preservare il link. shutil.move ha il comportamento corretto, a parte il fatto che rimuove il file originale.

Esiste un modo integrato in Python per eseguire una copia di file preservando i collegamenti simbolici?

risposta

38

Basta fare

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

shutil.copytree fa qualcosa di simile, ma come notato senderle, è schizzinosi riguardo copiando solo le directory e non dei file singoli.

+1

Ho provato a usare 'copytree' per fare ciò e ho ottenuto un errore OSE lamentando che' src' non era una directory; Penso che il controllo di 'os.path.islink' sia davvero l'unico modo. – senderle

+1

Penso che sia strano non ci sia una funzione dedicata per copiare i file (piuttosto che le directory come fa copytree) che preserva i collegamenti simbolici piuttosto che risolverli, ma non sono riuscito a trovarli. Sembra che questo sia l'unico modo ... –

Problemi correlati