Cuando de buscar y encontrar se trata, siempre recurriremos a la poderosa herramienta find. Esta vez vamos a ver cómo utilizar find para buscar links rotos (enlaces simbólicos que apuntan a archivos o directorios inexistentes).



A modo de ejemplo voy a utilizar una ruta a un directorio existente (/etc/exim4/) y otra a un archivo o directorio inexistente (/etc/postfix):

root@linuxito:/tmp# ls -d /etc/exim4/
/etc/exim4/
root@linuxito:/tmp# ls -d /etc/postfix
ls: cannot access '/etc/postfix': No such file or directory

A partir de estas rutas, creo dos enlaces simbólicos:

# cd /tmp/
# ln -s /etc/postfix postfix
# ln -s /etc/exim4/ exim4

Como los enlaces simbólicos no son más que una ruta a un archivo o directorio (no un puntero a un inodo existente, como es el caso de los enlaces duros o hard links), es posible hacer que apunten a una ruta inexistente.

Encontrar todos los enlaces simbólicos

De forma básica, para encontrar enlaces simbólicos, a partir del directorio actual, se emplea el predicado -type l:

# find -type l

Por ejemplo:

root@linuxito:/tmp# find -type l
./exim4
./postfix

Si se desea además saber a dónde apunta cada enlace, es posible ejecutar ls -l sobre cada resultado:

root@linuxito:/tmp# find -type l -exec ls -l {} \;
lrwxrwxrwx 1 root root 11 May 15 13:01 ./exim4 -> /etc/exim4/
lrwxrwxrwx 1 root root 12 May 15 13:01 ./postfix -> /etc/postfix

Encontrar sólo los enlaces rotos (broken links)

Más allá de que la salida de ls -l permite identificar un enlace roto mediante el uso de colores (rojo con fondo negro), esto no funciona desde find (pues se ejecuta en una subshell):

Por otro lado, es posible que la lista de enlaces encontrados sea larga y necesitemos encontrar precisa y programáticamente una lista de enlaces rotos.

find posee tres opciones específicas para enlaces simbólicos: -H, -L y -P. Cuando -L está en efecto, el predicado -type coincide con el tipo del archivo apuntado (en lugar del tipo de archivo del propio enlace). Pero esto funciona sólo si el enlace no está roto. Por ende, como efecto secundario, puede ser utilizado para buscar enlaces rotos utilizando el tipo l:

# find -L -type l -exec ls -l {} \;

Por ejemplo:

root@linuxito:/tmp# find -L -type l -exec ls -l {} \;
lrwxrwxrwx 1 root root 12 May 15 13:01 ./postfix -> /etc/postfix

Esto es exactamente igual a utilizar el predicado -xtype (sin la opción -L):

root@linuxito:/tmp# find -xtype l -exec ls -l {} \;
lrwxrwxrwx 1 root root 12 May 15 13:01 ./postfix -> /etc/postfix


Tal vez pueda interesarte


Compartí este artículo