Eliminar un enlace simbólico a un directorio

1085

Tengo un enlace simbólico a un directorio importante. Quiero deshacerme de ese enlace simbólico, manteniendo el directorio detrás de él.

Lo intenté rmy volví rm: cannot remove 'foo'.
Probé rmdiry regresé rmdir: failed to remove 'foo': Directory not empty
a continuación, que avanzaba a través rm -f, rm -rfysudo rm -rf

Luego fui a buscar mis copias de seguridad.

¿Hay alguna manera de deshacerse del enlace simbólico sin tirar al bebé con el agua del baño?

Matthew Scouten
fuente
74
¿Qué hay de malo en hacer preguntas relacionadas con Linux? la última vez que revisé, el desbordamiento de la pila no era específico del sistema operativo
Jeremy Cantrell
66
¿No sería esta pregunta más adecuada para Super User, o un Stack Exchange relacionado con Linux?
mwfearnley
45
@mwfearnley Sería, pero verifique la fecha. Super Usuario no era una cosa todavía en aquel entonces. Ha sido portado, así que también está allí. No estoy seguro de por qué todavía está aquí, pero es mi pregunta de mayor puntuación y no voy a mirar el karma de regalo en la boca.
Matthew Scouten
16
CONSEJO: rm -r link/ elimina el contenido en el objetivo
Gayan Weerakutti
31
Then I went to find my back-ups- Eso me hizo reír.
frakman1

Respuestas:

1309
# this works:
rm foo
# versus this, which doesn't:
rm foo/

Básicamente, debe indicarle que elimine un archivo , no que elimine un directorio . Creo que la diferencia entre rmy rmdirexiste debido a las diferencias en la forma en que la biblioteca C trata a cada uno.

En cualquier caso, el primero debería funcionar, mientras que el segundo debería quejarse de que foo es un directorio.

Si no funciona como se indica arriba, verifique sus permisos. Necesita permiso de escritura en el directorio que lo contiene para eliminar archivos.

Matthew Scharley
fuente
122
Ah, sí. eso tiene sentido. Nunca escribí foo, escribí f <tab> y bash completó un / para mí.
Matthew Scouten el
66
Esto no siempre funciona. Ocasionalmente, debe ejecutar rm -rf folderName(sin arrastrar /) para eliminar el enlace simbólico. Amazon Linux se comporta de esta manera bajo ciertas circunstancias, por ejemplo.
brandonscript
18
@ r3mus: nunca lo use -rcon un enlace simbólico a menos que quiera perder todo lo que contiene . -ftampoco debería ser necesario, excepto quizás para anular los permisos de archivo.
Matthew Scharley
27
Específicamente, unlinkno tiene relación con la lnoperación AKA 'link'. El nombre se unlinkrefiere al proceso de desvincular / eliminar un archivo de la tabla de archivos del sistema de archivos para que el contenido se separe de cualquier referencia a ellos; se desvinculan. Es un nombre confuso que es completamente engañoso cuando se aplica a enlaces y enlaces simbólicos en particular. unlinkfuncionará con enlaces simbólicos porque funciona con cualquier archivo independientemente del tipo.
Matthew Scharley
44
Si alguna vez te preocupa hacer algo tonto, alias rm="rm -i"creo que ha guardado más pieles que cualquier otra cosa.
Matthew Scharley
832

use el comando "desvincular" y asegúrese de no tener el / al final

$ unlink mySymLink

unlink () elimina un nombre del sistema de archivos. Si ese nombre fue el último enlace a un archivo y ningún proceso tiene el archivo abierto, el archivo se elimina y el espacio que estaba usando está disponible para su reutilización. Si el nombre era el último enlace a un archivo pero algún proceso aún tiene el archivo abierto, el archivo permanecerá en existencia hasta que se cierre el último descriptor de archivo que hace referencia a él.

Creo que esto puede ser problemático si lo estoy leyendo correctamente.

Si el nombre hace referencia a un enlace simbólico, el enlace se elimina.

Si el nombre se refiere a un socket, fifo o dispositivo, el nombre se elimina pero los procesos que tienen el objeto abierto pueden continuar usándolo.

https://linux.die.net/man/2/unlink

Joe Phillips
fuente
33
@OmarAbid La versión "rm foo /" me da miedo. Este parece mucho más seguro :)
Joe Phillips
99
En Ubuntu, he probado con ~/c/a/file, /c/b/, con ln -s ~/c/a ~/c/b/. En ~/c/b/, rm a/no funciona, rm -rf a/solo vacía el original a. unlink afunciona perfectamente y unlink a/no hace nada.
Brady Trainor
3
En OS X 10.10, unlinkes simplemente un alias para rm. Demuestra que se rmdebe utilizar la disciplina adecuada cuando se trata de cualquier parte de la estructura de su directorio.
Doug Powers
1
En las secuencias de comandos rm -f, se eliminará silenciosamente un enlace, exista o no, mientras que unlinkse quejará si el enlace no está presente. No hay una opción '-f' equivalente para desvincular, hace que el script sea más complejo.
Usuario de Linux shonky
22
unlinkPuede eliminar archivos normales. es menos característico que rmy no específico para enlaces simbólicos. rmtampoco elimina directorios sin la -rbandera. Así que recomiendo preferir rm, tiene banderas para verbose e interactivo; así como mensajes de advertencia y error significativos.
ThorSummoner
18

rm debería eliminar el enlace simbólico.

skrall@skrall-desktop:~$ mkdir bar
skrall@skrall-desktop:~$ ln -s bar foo
skrall@skrall-desktop:~$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar
skrall@skrall-desktop:~$ rm foo
skrall@skrall-desktop:~$ ls -l foo
ls: cannot access foo: No such file or directory
skrall@skrall-desktop:~$ ls -l bar
total 0
skrall@skrall-desktop:~$ 
Steve K
fuente
17

Use rm symlinknamepero no incluya una barra diagonal al final (no use:) rm symlinkname/. Luego se le preguntará si desea eliminar el enlace simbólico, ypara responder que sí.

DeeEss09
fuente
63
No está equivocado, pero la respuesta correcta ya está aquí y fue aceptada (¡hace 4 años!). ¿Por qué molestarse?
Matthew Scouten
1
Google tenía esto como el fragmento destacado al buscar "Eliminar un enlace simbólico". Tal vez le gustó su brevedad, no estoy seguro de cómo funciona su heurística. De todos modos, prontamente hice un facepalm cuando volví a mirar mi línea de comando :-)
Randall
12

Asumiendo que en realidad es un enlace simbólico,

$ rm -d symlink

Debería resolverlo, pero como no puede, habilitamos el código latente destinado a otro caso que ya no existe pero que hace lo correcto aquí.

Joshua
fuente
7

Si rm no puede eliminar un enlace simbólico, tal vez necesite mirar los permisos en el directorio que contiene el enlace simbólico. Para eliminar entradas de directorio, necesita permiso de escritura en el directorio que lo contiene.

Greg Hewgill
fuente
4

Suponiendo que su configuración es algo como:, ln -s /mnt/bar ~/fooentonces debería poder hacer rm foosin problemas. Si no puede, asegúrese de ser el propietario del fooy tener permiso para escribir / ejecutar el archivo. La eliminación foono se tocará bar, a menos que lo haga de forma recursiva.

TJ L
fuente
2

En CentOS, simplemente ejecute rm linknamey le pedirá "¿eliminar el enlace simbólico?". Escriba Yy Enter, el enlace desaparecerá y el directorio estará seguro.

Yuri
fuente
2

Tuve este problema con MinGW (en realidad Git Bash) ejecutándose en un servidor de Windows. Ninguna de las sugerencias anteriores parecía funcionar. Al final, hice una copia del directorio en caso de que luego eliminé el enlace flexible en el Explorador de Windows y luego eliminé el elemento en la Papelera de reciclaje. Hizo ruidos como si estuviera borrando los archivos pero no lo hizo. ¡Sin embargo, haz una copia de seguridad!

Keith Whittingham
fuente
3
"Hacía ruidos como si estuviera borrando archivos ..." - ¡Guau!
Sterex
LMFAO. "Hacía ruidos como si estuviera borrando archivos ..."
Shivam Jha
¡Recuerdo los disquetes!
Keith Whittingham
Ninguno de los anteriores funcionó para mí: eddyq @ eddyq-Latitude-E6440: ~ $ ls Descargas de escritorio Dropbox-Windows Música Videos públicos w Documentos Dropbox ejemplos.desktop Imágenes Plantillas 'Archivos VmWare vmx'
eddyq