¿Rm -rf sigue enlaces simbólicos?

72

Tengo un directorio como este:

$ ls -l
total 899166
drwxr-xr-x 12 me scicomp       324 Jan 24 13:47 data
-rw-r--r--  1 me scicomp     84188 Jan 24 13:47 lod-thin-1.000000-0.010000-0.030000.rda
drwxr-xr-x  2 me scicomp       808 Jan 24 13:47 log
lrwxrwxrwx  1 me scicomp        17 Jan 25 09:41 msg -> /home/me/msg

Y quiero eliminarlo usando rm -r.

Sin embargo, tengo miedo de rm -rque siga el enlace simbólico y elimine todo en ese directorio (que es muy malo).

No puedo encontrar nada sobre esto en las páginas de manual. ¿Cuál sería el comportamiento exacto de ejecutar rm -rfdesde un directorio por encima de este?

Greg
fuente
16
¿Qué tan difícil es crear un directorio ficticio con un enlace simbólico que apunta a un archivo ficticio y ejecutar el escenario? ¡Entonces sabrás con seguridad cómo funciona!
@LordDoskias Personalmente estoy bastante feliz de que yo y las 46 mil personas que hemos visitado la página pudimos simplemente leer el resultado sin experimentar por sí mismos. Y, podrían haber evitado un desastre feo al hacer que sus experimentos fueran exitosos y luego hacerlo accidentalmente rm -rf somesymlink/, lo cual es destructivo con el seguimiento /. Si el 5% de los lectores hubieran experimentado, y tal experimento lleva 2.5 minutos, eso es 5700 minutos, o 95 horas, o una contribución de $ 6000 a la sociedad a $ 60 / hora. Creo que a todos nos gusta TAN cómo es, hagamos y respondamos preguntas juntos: 3
Nicholas Pipitone

Respuestas:

57

Ejemplo 1: Eliminar un directorio que contiene un enlace suave a otro directorio.

susam@nifty:~/so$ mkdir foo bar
susam@nifty:~/so$ touch bar/a.txt
susam@nifty:~/so$ ln -s /home/susam/so/bar/ foo/baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── foo
    └── baz -> /home/susam/so/bar/

3 directories, 1 file
susam@nifty:~/so$ rm -r foo
susam@nifty:~/so$ tree
.
└── bar
    └── a.txt

1 directory, 1 file
susam@nifty:~/so$

Entonces, vemos que el objetivo del enlace suave sobrevive.

Ejemplo 2: Eliminar un enlace suave a un directorio

susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── baz -> /home/susam/so/bar

2 directories, 1 file
susam@nifty:~/so$ rm -r baz
susam@nifty:~/so$ tree
.
└── bar
    └── a.txt

1 directory, 1 file
susam@nifty:~/so$

Solo, el enlace suave se elimina. El objetivo del enlace suave sobrevive.

Ejemplo 3: Intento de eliminar el objetivo de un enlace suave

susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── baz -> /home/susam/so/bar

2 directories, 1 file
susam@nifty:~/so$ rm -r baz/
rm: cannot remove 'baz/': Not a directory
susam@nifty:~/so$ tree
.
├── bar
└── baz -> /home/susam/so/bar

2 directories, 0 files

El archivo en el destino del enlace simbólico no sobrevive.

Los experimentos anteriores se realizaron en un sistema Debian GNU / Linux 9.0 (stretch).

Susam Pal
fuente
12
rm -rf baz / * eliminará el contenido
Wyrmwood
2
Sí, si haces rm -rf [enlace simbólico], ¡entonces el contenido del directorio original será borrado! Ten mucho cuidado.
Buttle Butkus
@frnknstn Tienes razón. Veo el mismo comportamiento que mencionas en mi último sistema Debian. No recuerdo en qué versión de Debian realicé los experimentos anteriores. En mis experimentos anteriores en una versión anterior de Debian, a.txt debe haber sobrevivido en el tercer ejemplo o debo haber cometido un error en mi experimento. He actualizado la respuesta con el comportamiento actual que observo en Debian 9 y este comportamiento es consistente con lo que usted menciona.
Susam Pal
19

Su directorio / home / me / msg estará seguro si rm -rf el directorio desde el que ejecutó ls. Solo se eliminará el enlace simbólico en sí, no el directorio al que apunta.

Lo único de lo que sería cauteloso sería si llamaras algo así como "rm -rf msg /" (con la barra diagonal final). No hagas eso porque eliminará el directorio al que apunta msg, en lugar del enlace simbólico msg sí mismo.

Ken Simon
fuente
3
"Lo único de lo que sería cauteloso sería si llamaras algo así como" rm -rf msg / "(con la barra diagonal final). No hagas eso porque eliminará el directorio al que apunta msg, en lugar del msg enlace simbólico en sí mismo ". - No creo que esto sea cierto. Vea el tercer ejemplo en mi respuesta a continuación.
1
Obtengo el mismo resultado que @Susam ('rm -r symlink /' no elimina el objetivo del enlace simbólico), lo cual me complace, ya que sería un error muy fácil de cometer.
idoimaging
5

rmdebería eliminar archivos y directorios. Si el archivo es un enlace simbólico, el enlace se elimina, no el destino. No interpretará un enlace simbólico. Por ejemplo, cuál debería ser el comportamiento al eliminar 'enlaces rotos': las salidas de rm con 0 no con un valor distinto de cero para indicar un error

Jayan
fuente