¿Cómo puedo eliminar todos los enlaces simbólicos con un objetivo especial?

Con el comando:

ls -la * 

Puedo enumerar todos mis enlaces simbólicos.

¿Cómo puedo eliminar todos los enlaces simbólicos que están vinculados a una carpeta especial?

Por ejemplo:

En mi directorio usr/local/bin Tengo las siguientes entradas:

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara 

Ahora quiero eliminar todos los enlaces con la ruta /usr/local/texlive/

Comentarios

  • ¿Te refieres a eliminar todos los enlaces simbólicos vinculados a una carpeta de destino? ¿O mover todos los enlaces simbólicos encontrados a una carpeta específica?
  • @uther: me refiero a eliminar los enlaces.

Responder

Asegúrese de leer la respuesta alternativa . Es aún más pertinente, aunque no se votó tan alto en este momento.

Puede usar esto para eliminar todos los enlaces simbólicos:

find -type l -delete 

con versiones modernas find.

En versiones de búsqueda anteriores, puede que tenga que ser:

find -type l -exec rm {} \; # or find -type l -exec unlink {} \; 

Para limitar a un determinado destino de enlace, suponiendo que ninguna de las rutas contenga un carácter de nueva línea:

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink "$lnkname")" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done 

o bien formateado

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink "$lnkname")" = "/your/exact/path" ]; then rm -- "$lnkname" fi done 

El if también podría incluir una condición más compleja, como hacer coincidir un patrón con grep.


Adaptado a su caso:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q "^/usr/local/texlive/"); then rm "$lnk"; fi; done 

o bien formateado:

find -type l | while IFS= read -r lnk do if readlink "$lnk" | grep -q "^/usr/local/texlive/" then rm "$lnk" fi done 

Comentarios

  • ¿Este comando elimina todos los enlaces simbólicos? Por favor, vea mi edición arriba ..
  • @ Marco: sí, las primeras tres líneas lo harían. Editando más 🙂
  • También agregaría un -print al final del

comando para obtener comentarios visuales.

Responder

Con un find moderno que admita -lname:

find /usr/local/bin -lname "/usr/local/texlive/*" -delete 

debería funcionar it.

Comentarios

  • Esa es una gran y simple solución. Probé y funciona de maravilla. Gracias
  • Presumiblemente, debería ser find /usr/local/bin
  • Ni siquiera moderno, necesariamente. GNU find ha tenido -lname por más tiempo del que lo he mantenido (desde alrededor de 2003).
  • @JamesYoungman: ¡Gracias! Por moderno find realmente me refería a GNU find. 😉 Usé usr/local/bin, porque eso ' es lo que usó el OP.

Respuesta

La find solución es excelente.

En caso de que su búsqueda no lo haga admite -lname, aquí hay otra forma que usa solo shell y readlink.

cd /usr/local/bin for f in *; do case "$(readlink "$f")" in /usr/local/texlive/*) rm "$f" ;; esac done 

Responde

Con zsh:

rm -f /usr/local/bin(@e"{[[ $REPLY:P = /usr/local/texlive/* ]]}") 

$REPLY:P resuelve completamente la ruta a una sin enlace simbólico, por lo que suponiendo que /usr/local/texlive no tiene enlace simbólico , eliminaría todos los archivos que, después de la resolución del enlace simbólico, se encuentran en /usr/local/textlive que incluirían enlaces a /usr/local/texlive/foo pero también a ../texlive/bar oa /usr/./local/texlive/whatever o a /some/other/symlink, que en sí mismo es un enlace simbólico que apunta a /usr/local/texlive, etc.

Respuesta

Vaya a su ruta y establezca su configuración de ruta

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk "{print $9}"|xargs rm -rf 

Comentarios

  • Dado que estas son rutas como usr/local/bin que grep está buscando, grep -E es el camino a seguir. De lo contrario, no habría resultados coincidentes. ¡También h en ls no ' tiene ningún propósito aquí! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Para obtener más información, consulte man ls o man grep

Respuesta

sudo unlink /path/of/your/package

eso es

Comentarios

  • ¿Cómo elimina esto todos los enlaces simbólicos que apuntan a objetivos debajo de la ruta dada? Tenga en cuenta que la pregunta se refiere a eliminar los enlaces simbólicos en un directorio en particular que apunta a objetivos en algún otro directorio.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *