Problema con recursividad infinita en bash
Me han encargado la realización de un script para administrar el tamaño máximo de archivos en un sistema linux (compo practica de la carrera). El script debe recorrer el árbol de ficheros y eliminar los ficheros que excedan un determinado tamaño para así mantener un limite en el consumo de disco de los usuarios.
En principio hacer el script más básico fue fácil, recorriendo el árbol de ficheros recursivamente, ordenando por tamaños y borrando los que ocuparan más de POR Kbytes. El problema me surge cuando introduzco enlaces smbolicos, a ver si no me lio mucho al explicarlo
Si un directorio posee un enlace simbólico a otro directorio que esta por encima en el árbol de directorios (Es antepasado). Al entrar de forma recursiva en el enlace, se creara un bucle infinito ya que eventualmente de su antepasado se volverá al directorio con el enlace.
Luego pensé en recordar la ruta a la que llevaba el ultimo enlace visitado y si ya se había visitado no volver a hacerlo, pero a parte de que podría recorrer dos veces la misma rama, me surgió otro problema, que pondré en un esquema para que se entienda mejor.
Las flechas discontinuas representan los enlaces simbólicos.
Cuando recorro el subarbol de A, llego al nodo F que me devuelve a A y así sucesivamente. Si recuerdo el ultimo enlace visitado, al llegar a F no volveré a entrar, (aunque recorreré dos veces el mismo árbol y también es un problema) aun así suponiendo que recordar el ultimo enlace fuese válido, me surge el problema del nodo E, al llegar al nodo E recorro E->F y E es el ultimo enlace visitado, pero luego recorro el nodo F->A pasando a ser F el ultimo enlace visitado al volver a F no habría problema (salvo el de haber recorrido más de una vez, ya mencionado) pero cuando llegue a E, el ultimo enlace visitado seguirá siendo F por lo tanto sera válido E->F y posteriormente F->A
Bueno espero no haberme liado demasiado.
En principio hacer el script más básico fue fácil, recorriendo el árbol de ficheros recursivamente, ordenando por tamaños y borrando los que ocuparan más de POR Kbytes. El problema me surge cuando introduzco enlaces smbolicos, a ver si no me lio mucho al explicarlo
Si un directorio posee un enlace simbólico a otro directorio que esta por encima en el árbol de directorios (Es antepasado). Al entrar de forma recursiva en el enlace, se creara un bucle infinito ya que eventualmente de su antepasado se volverá al directorio con el enlace.
Luego pensé en recordar la ruta a la que llevaba el ultimo enlace visitado y si ya se había visitado no volver a hacerlo, pero a parte de que podría recorrer dos veces la misma rama, me surgió otro problema, que pondré en un esquema para que se entienda mejor.
Las flechas discontinuas representan los enlaces simbólicos.
Cuando recorro el subarbol de A, llego al nodo F que me devuelve a A y así sucesivamente. Si recuerdo el ultimo enlace visitado, al llegar a F no volveré a entrar, (aunque recorreré dos veces el mismo árbol y también es un problema) aun así suponiendo que recordar el ultimo enlace fuese válido, me surge el problema del nodo E, al llegar al nodo E recorro E->F y E es el ultimo enlace visitado, pero luego recorro el nodo F->A pasando a ser F el ultimo enlace visitado al volver a F no habría problema (salvo el de haber recorrido más de una vez, ya mencionado) pero cuando llegue a E, el ultimo enlace visitado seguirá siendo F por lo tanto sera válido E->F y posteriormente F->A
Bueno espero no haberme liado demasiado.
1 Respuesta
Respuesta de alberich74
1