2012-05-28 23 views
10

Lo que básicamente me gustaría hacer es cp -Rl dir1 dir2. Pero según tengo entendido, python solo proporciona shutils.copytree(src,dst), que realmente copia los archivos, pero no tiene la posibilidad de enlazar los archivos.Creación recíproca de enlaces duros con python

Sé que podría invocar el comando cp usando el módulo subprocess, pero me gustaría encontrar una forma más limpia (pitónica) de hacerlo.

¿Hay alguna manera fácil de hacerlo o tengo que implementarlo recurriendo a través de los directorios?

+0

El recorrido de directorio es bastante fácil de hacer, ¿por qué no intentarlo? – Blender

+2

No se trata de intentar o no intentarlo: la pregunta más bien quiere decir "No puedo imaginar que esto no se haya hecho antes cientos de veces y, por lo tanto, debe estar disponible en el módulo xy". Reinventar la rueda todo el tiempo simplemente no parece correcto. – devsnd

Respuesta

15

Simplemente tiene que llamar al os.system("cp -Rl dir1 dir2"), no es necesario que escriba a mano su propia función.

Editado: Ya que quiere hacer esto en python.

usted tiene razón: Es ES disponibles en el módulo shutil

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

Como indiqué, prefiero no utilizar el módulo de subproceso. Eso también significa que no querría usar la llamada 'os.system', ya que me da incluso menos control que' subprocess'. Especialmente porque 'os.system' puede fallar silenciosamente. – devsnd

+1

@twall: tenga en cuenta que esto es solo Python 3. En Python 2, puede modificar el código de ejemplo: http://docs.python.org/library/shutil.html#copytree-example – Kabie

+1

¡Ah genial! Ya utilicé el ejemplo de Damian Ayers y lo modifiqué según mis necesidades, pero esta es en realidad la solución en la que pensé. (Debería haber mirado las fuentes de shutil antes ...) ¡Gracias! – devsnd

7

He aquí una función de Python en papel puro. En caso de trabajar lo mismo que 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

Gracias, eso se ve bien para mí, lo intentaré. – devsnd

+0

Perdón por no aceptar su respuesta, pero la otra realmente es la respuesta correcta a esa pregunta, aunque su respuesta también resuelve el problema. Gracias de nuevo. – devsnd

+0

Sin preocupaciones. No he mirado mucho a Python 3, pero si eso es lo que buscas es una solución mucho más ordenada. :) –

Cuestiones relacionadas