¿Cómo elimino el objetivo de un enlace simbólico sin eliminar el enlace en sí?

10

Tengo un enlace simbólico ~/Desktop/test.txtque apunta a ~/rendu/test.txt.

Solo conozco la ruta de ~/Desktop/test.txt, quiero una forma rápida de eliminar ~/rendu/test.txtSIN eliminar el enlace simbólico.

Para el que quiere saber por qué: tengo un archivo con nombre crypted.xxxen mi escritorio, que está encriptado y contiene mi contraseña.

Cuando quiero actualizar mi archivo encriptado, lo desencripto y lo creo crypted.txten un directorio especial. Así que hago un enlace a ese archivo en mi escritorio por razones prácticas. Pero después de mirar mi crypted.txt, quiero eliminar esto rápidamente crypted.txt(pero no el enlace en el escritorio).

Ugo Hed
fuente
44
espere, desea eliminar el archivo (como sugiere su pregunta) o eliminar el contenido del archivo (como
dice
Elimina el archivo y mantén el enlace simbólico, perdón por malentendidos
Ugo Hed
2
¿Tal vez podría considerar usar un administrador de contraseñas dedicado? Keepass es bastante bueno, por ejemplo, y está en los repositorios.
evilsoup

Respuestas:

11

usando findpara encontrar el enlace simbólico y luego usando readlinkpara obtener la ruta completa al destino para rm:

find ~/Desktop/ -type l -name 'test.txt' -exec bash -c 'rm "$(readlink -f "$1")"' _ {} \;

O como ya sabes el nombre del enlace:

rm "$(readlink -f ~/Desktop/test.txt)"
heemayl
fuente
44
Sin embargo, tenga cuidado con los enlaces relativos. Un enlace simbólico relativo se interpreta como relativo al directorio en el que se encuentra. Pero su rmcomando lo interpretará como relativo al directorio actual del shell. Por lo tanto, existe la posibilidad de que ese comando elimine un archivo diferente del que apuntaba el enlace simbólico.
Kasperd 05 de
55
@kasperd With -f -eo -mse devuelve la ruta completa, incluso si el enlace simbólico objetivo apunta a una ruta relativa, así que sí, eso es una preocupación en caso de rm "$(readlink ~/Desktop/test.txt)", pero no cuando se usa -f -eo -m.
kos
@kos Tienes razón. En ese caso, solo debe preocuparse si puede haber condiciones de carrera.
kasperd el
Alternativamente, uno puede usar realpath , que en este caso hace lo mismo que readlink -f(pero también funciona si el objetivo en sí no es un enlace).
Leftaroundabout
6

Simplemente use:

printf "" > "$(readlink '/path/to/link')"

para borrar el archivo, o

rm "$(readlink '/path/to/link')"

para eliminar el archivo

Jacob Vlijm
fuente