soporta sistema simbólicos simbólico simbolico permiten para links link fuertes enlaces enlace eliminar editar duros directorios crear como comando borrar archivos bash shell unix symlink

bash - sistema - links simbólicos



¿Eliminar todos los enlaces simbólicos rotos con una línea? (8)

Para una carpeta determinada, ¿cómo puedo eliminar todos los enlaces rotos dentro de ella?

Encontré esta respuesta que muestra cómo eliminar un enlace roto, pero no puedo juntar eso en una sola línea. ¿Hay un trazador de líneas para esto?

Un simbólico roto es un enlace que apunta a un archivo / carpeta que ya no existe.


Del man find EJEMPLOS:

find -L /usr/ports/packages -type l -exec rm -- {} +

Elimine todos los enlaces simbólicos rotos en / usr / ports / packages.


El paquete de symlinks está preinstalado en muchas distribuciones (incluyendo Ubuntu 16.04 y Fedora 25) y tiene algunas características realmente útiles, una de las cuales es precisamente lo que está buscando:

symlinks -d ./


Para MAC , haga un recorrido en seco de la siguiente manera:

DIR=<some path> find -L $DIR -maxdepth 1 -type l -print

Ahora puedes podar los enlaces simbólicos viejos de la siguiente manera:

for f in `find -L $DIR -maxdepth 1 -type l`; do unlink $f; done


Puede usar readlink para determinar si un enlace simbólico está roto o no.

Lo siguiente enumeraría todos los enlaces simbólicos rotos en un directorio determinado (y subdirectorios):

find . -type l -exec sh -c ''readlink -f "{}" 1>/dev/null || echo "{}"'' -- "{}" /;

Reemplace echo con rm para deshacerse de los rotos!

(He redirigido la salida de readlink a /dev/null para evitar confusiones; se listaría el objetivo para los enlaces simbólicos).


Puedes intentar usar rmlint .

Primero, cambie el directorio a la carpeta que contiene enlaces simbólicos rotos, y luego ejecute los siguientes comandos para encontrar enlaces simbólicos incorrectos que no señalan a ninguna parte :

rmlint --types="badlinks"

Entonces rmlint creará un script bash rmlint.sh en su directorio actual e imprimirá una lista de enlaces simbólicos incorrectos en su terminal. Para eliminar todos los enlaces simbólicos incorrectos en su directorio actual, puede ejecutar

./rmlint.sh

No es exactamente un trazador de líneas, pero es muy fácil de utilizar.



Respuesta simple basada en la respuesta que vinculó (para un directorio determinado, $DIR ):

find -L $DIR -maxdepth 1 -type l -delete


Aquí hay una forma POSIX de eliminar todos los enlaces simbólicos rotos en el directorio actual, sin recurrencia. Funciona al indicar que -prune atraviese enlaces simbólicos ( -L ), pero que detenga ( -prune ) en cada directorio-o-enlace simbólico-a-tal.

find -L . -name . -o -type d -prune -o -type l -exec rm {} +

También puede usar un bucle de shell. La prueba -L coincide con los enlaces simbólicos, y -e coincide con los archivos existentes (sin incluir los enlaces simbólicos rotos).

for x in * .[!.]* ..?*; do if [ -L "$x" ] && ! [ -e "$x" ]; then rm -- "$x"; fi; done

Si desea recurse en subdirectorios, esta técnica no funciona. Con GNU find (como se encuentra en Linux y Cygwin no integrados), puede usar el predicado -xtype para detectar enlaces simbólicos rotos ( -xtype usa el tipo de destino para enlaces simbólicos, e informa l para enlaces rotos).

find -xtype l -delete

POSIX, necesitas combinar dos herramientas. Puede usar find -type l -exec … para invocar un comando en cada enlace simbólico, y [ -e "$x" ] para probar si ese enlace no está roto.

find . -type l -exec sh -c ''for x; do [ -e "$x" ] || rm "$x"; done'' _ {} +

La solución más simple es usar zsh. Para eliminar todos los enlaces simbólicos rotos en el directorio actual:

rm -- *(-@D)

Los caracteres entre paréntesis son calificadores glob : - para desreferenciar los enlaces simbólicos, @ para hacer coincidir solo los enlaces simbólicos (la combinación -@ significa enlaces simbólicos rotos solamente), y D para hacer coincidir los archivos de puntos. Para recurse en subdirectorios, haga que rm -- **/*(-@D) .