2012-05-28 17 views
10

Quello che sostanzialmente vorrei fare è cp -Rl dir1 dir2. Ma a quanto ho capito, python fornisce solo shutils.copytree(src,dst) che copia effettivamente i file, ma non ha la possibilità di collegare i file invece.Creazione ricorsiva di collegamenti temporali con python

So che potrei invocare il comando cp utilizzando il modulo subprocess, ma preferirei trovare un modo più pulito (pitonico) per farlo.

Quindi c'è un modo semplice per farlo o devo implementarlo personalmente ricorsivamente attraverso le directory?

+0

La directory traversal è piuttosto facile da fare, quindi perché non provarlo? – Blender

+2

Non si tratta di provare o non provare: la domanda piuttosto vuole dire "Non posso immaginare che questo non sia stato fatto prima di centinaia di volte e quindi deve essere disponibile nel modulo xy". Reinventare la ruota tutto il tempo non sembra giusto. – devsnd

risposta

15

Devi solo chiamare os.system("cp -Rl dir1 dir2"), non è necessario scrivere a mano la propria funzione.

Modificato: Poiché si desidera farlo in python.

Hai ragione: è È disponibili nel modulo shutil

shutil.copytree(src, dst, copy_function=os.link) 
+1

Come ho detto, preferisco non utilizzare il modulo di sottoprocesso. Ciò significa anche che non vorrei usare la chiamata 'os.system', in quanto mi dà ancora meno controllo di' sottoprocesso'. Soprattutto perché 'os.system' potrebbe fallire silenziosamente. – devsnd

+1

@twall: nota che questo è solo Python 3. In Python 2, potresti modificare il codice di esempio: http://docs.python.org/library/shutil.html#copytree-example – Kabie

+1

Ah fantastico! Ora ho già usato l'esempio di Damian Ayers e l'ho modificato alle mie esigenze, ma questa è in realtà la soluzione che ho pensato. (Avrei dovuto guardare le fonti di chiusura prima ...) Grazie! – devsnd

7

Ecco una pura funzione pitone cartaceo. Dovrebbe funzionare allo stesso modo di cp -Rl src dst

import os 
from os.path import join, abspath 

def hardcopy(src, dst): 
    working_dir = os.getcwd() 
    dest = abspath(dst) 
    os.mkdir(dst) 
    os.chdir(src) 
    for root, dirs, files in os.walk('.'): 
     curdest = join(dst, root) 
     for d in dirs: 
      os.mkdir(join(curdst, d)) 
     for f in files: 
      fromfile = join(root, f) 
      to = join(curdst, f) 
      os.link(fromfile, to) 
    os.chdir(working_dir) 
+0

Grazie, mi sembra carino, lo proverò. – devsnd

+0

Ci scusiamo per aver rifiutato la tua risposta, ma l'altra è davvero la risposta giusta a questa domanda, anche se la tua risposta risolve anche il problema. Grazie ancora. – devsnd

+0

Nessun problema. Non ho guardato molto a python 3, ma se è quello su cui ti trovi è una soluzione molto più ordinata. :) –

Problemi correlati