2012-07-28 57 views
17

He intentado eliminar algunos enlaces simbólicos en mi directorio de trabajo, pero tengo algunos problemas.¿Cómo eliminar un enlace simbólico en python?

os.remove elimina también el contenido real de la carpeta original del enlace

os.shutil arroja un error en el caso de los enlaces simbólicos.

¿Hay alguna manera de eliminar un enlace simbólico utilizando comandos de Python sin destruir el contenido original?

Gracias

+7

Strange, 'os.remove()' no elimina el archivo original para yo, solo el enlace simbólico (probado con Python 2.7.2 y 3.1.4). –

+1

No elimina el archivo original ni en mi sistema (Python 2.7.1) –

+0

Smth worth-looking en enlaces simbólicos: http://stackoverflow.com/a/12678252/110118 (nota: shutil.rmtree no podría eliminar un enlace, a pesar de que os.path.osdir() dice que la ruta pertenece a un directorio) – mlvljr

Respuesta

20

os.unlink() trabaja para mí. Elimina el enlace simbólico sin eliminar el directorio al que se vincula.

+0

Sí ... Funcionó Gracias – akshayc11

+10

Documentación de Python 2.7 sobre desvinculación: 'Esta es la misma función que remove();', ¿cómo resolvió el problema? –

+0

Esta solución no funciona en Windows para enlaces de directorio creados a través de 'mklink/D'. Vea mi respuesta a continuación si ese es su problema. – MOnsDaR

3

Si el nombre del directorio contiene una barra al final, el comando linux rm seguirá el enlace y tratar de eliminar el directorio. Ver Remove a symlink to a directory. El os.removedocumentation dice que le dará un OSError si intenta eliminar un directorio, pero quizás eso no siempre ocurra en el caso de los enlaces simbólicos.

+1

Dice 'OSError: [Errno 1] Operación no permitida: 'test /'' para mí. Probablemente depende de la implementación. –

+1

No tengo Python a mano. Debería haber dicho que esto fue una suposición. He editado la respuesta. –

+0

@JohnWatts Su respuesta es verdadera, pero esto solo es cierto para los enlaces simbólicos creados por el shell. los enlaces simbólicos creados por 'os.symlink' todavía dan el mismo problema – akshayc11

1

Lo siento, mi Malo, había cometido un error de programación estúpido: estaba borrando estúpidamente la fuente en lugar de los enlaces.

La respuesta correcta es @samfrances.

os.unlink hace el truco.

Además de esto, aquí algunos consejos si desea borrar un directorio usando Python:

Definitivamente no es multi-hilo, pero se entiende la idea ...

def rm(obj): 

    if os.path.exists(obj): 
     if os.path.isdir(obj): 
      if os.path.islink(obj): 
       os.unlink(obj) 
      else: 
       shutil.rmtree(obj) 
     else: 
      if os.path.islink(obj): 
       os.unlink(obj) 
      else: 
       os.remove(obj) 
+0

do 'if os.path.exists (obj)' then 'if os.path.islink' then' if os.path.isdir'. de esa manera no necesita tener os.unlink dos veces. – QxQ

2

La respuesta aceptada hace no funciona en Windows con enlaces creados a través de mklink /D. Si ese es su problema la respuesta ha sido publicado en esta pregunta: Delete Symlink to directory on Windows

El siguiente código debería funcionar en ambos sistemas:

if(os.path.isdir(targetLink)): 
    os.rmdir(targetLink) 
else: 
    os.unlink(targetLink) 
Cuestiones relacionadas