Recién me di cuenta de una mala interpretación que tenía sobre la opción -R del comando rm. Por ser la opción obligadamente usada cuando se borra todo un árbol de directorios, consideraba que la opción -R se trataba de una facilidad del comando para recursivamente eliminar cualquier archivo que uno pudiera querer en un árbol de directorios pero no es así.
El comando y opción rm -R permite borrar un directorio que pueda contener a su vez otros directorios, y así sucesivamente, permitiendo que al encontrar un directorio se borre primero su contenido antes que su contenedor para evitar el típico error y mensaje "non-empty directory". Esto puede malinterpretarse como una facilidad de búsqueda recursiva y eliminación general pero es aplicada únicamente si hay directorios involucrados.
Para ilustrar esta explicación nada mejor que un ejemplo práctico. Considérese lo siguiente:
[equipo] /opt/mi-sistema : > echo $SHELL
/usr/bin/sh
[equipo] /opt/mi-sistema : > uname -a
HP-UX equipo B.11.00 A 9000/800 159474646 two-user license
[equipo] /opt/mi-sistema : > mkdir A
[equipo] /opt/mi-sistema : > cd A
[equipo] /opt/mi-sistema/A : > mkdir B
[equipo] /opt/mi-sistema/A : > cd B
[equipo] /opt/mi-sistema/A/B : > touch 1
[equipo] /opt/mi-sistema/A/B : > touch b
[equipo] /opt/mi-sistema/A/B : > touch 2
[equipo] /opt/mi-sistema/A/B : > touch 3
[equipo] /opt/mi-sistema/A/B : > ls
1 2 3 b
[equipo] /opt/mi-sistema/A/B : > cd ..
[equipo] /opt/mi-sistema/A : > ls
B
[equipo] /opt/mi-sistema/A : > touch 3
[equipo] /opt/mi-sistema/A : > touch x
[equipo] /opt/mi-sistema/A : > touch 2
[equipo] /opt/mi-sistema/A : > ls
2 3 B x
[equipo] /opt/mi-sistema/A : > ls -R
2 3 B x
./B:
1 2 3 b
Puede verse que hemos creado dos directorios A y B, el primero conteniendo al segundo y ambos con ciertos archivos (si bien vacíos pero eso no importa) en ellos. Ahora veamos qué pasa si tratamos de borrar a los archivos de nombre b en ellos, asumiendo que la opción -R de rm nos permitirá navegar a través del árbol de directorios.
[equipo] /opt/mi-sistema/A : > rm -R b
rm: b non-existent
Ciertamente no existe un archivo de nombre b en A pero ¿qué hay de ./B/b? ¿Fue eliminado? ls -R nos muestra que no.
[equipo] /opt/mi-sistema/A : > ls -R
2 3 B x
./B:
1 2 3 b
Ahora veamos que pasa si hay un archivo b en A.
[equipo] /opt/mi-sistema/A : > touch b
[equipo] /opt/mi-sistema/A : > ls -R
2 3 B b x
./B:
1 2 3 b
[equipo] /opt/mi-sistema/A : > rm -R b
[equipo] /opt/mi-sistema/A : > ls -R
2 3 B x
./B:
1 2 3 b
[equipo] /opt/mi-sistema/A : >
Podemos ver que en A, el archivo b es eliminado pero el comando no alcanza al b en B, ¿la razón? Como se apunta al inicio de este post, no se trata de una opción que permita extender recursivamente cualquier acción que se indique para rm. Solamente permite que en caso de que directorios sean involucrados en una acción de borrado, sea su contenido (recursivamente) eliminado para que éste (el directorio involucrado) puede serlo también.
