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

43

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/bintengo 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/

Marco Daniel
fuente
1
¿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?
George M
@uther: me refiero a eliminar los enlaces.
Marco Daniel

Respuestas:

63

Asegúrate de leer la respuesta alternativa . Es aún más importante, aunque no se ha votado tan alto en este momento.

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

find -type l -delete

Con findversiones modernas .

En versiones anteriores de búsqueda, puede ser:

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

Para limitar a un determinado objetivo de enlace, suponiendo que ninguna de las rutas contiene ningún 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

Por ifsupuesto, 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
0xC0000022L
fuente
¿Este comando elimina todos los enlaces simbólicos? Por favor vea mi edición arriba ..
Marco Daniel
@Marco: sí, las primeras tres líneas lo harían. Edición más :)
0xC0000022L
También agregaría un -printal final del findcomando para obtener algunos comentarios visuales.
runlevel0
30

Con un moderno findque soporta -lname:

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

Deberías hacerlo.

Christoffer Hammarström
fuente
1
Esa es una gran y simple solución. Lo probé y funciona de maravilla. Gracias
Marco Daniel
Presumiblemente eso debería serfind /usr/local/bin
James Youngman
1
Ni siquiera moderno, necesariamente. GNU findha tenido -lnamemás tiempo del que lo he mantenido (desde alrededor de 2003).
James Youngman
@JamesYoungman: ¡Gracias! Por moderno findrealmente me refería a GNU find. ;) Yo solía usr/local/bin, porque eso es lo que usaba el OP.
Christoffer Hammarström
5

La findsolución es genial.

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

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

Con zsh:

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

$REPLY:Presuelve completamente la ruta de acceso a uno sin enlace simbólico, por lo que suponiendo que /usr/local/texliveesté libre de enlace simbólico en sí mismo, eliminaría todos los archivos que, después de la resolución de enlace simbólico, viven bajo los /usr/local/textlivecuales incluiría enlaces /usr/local/texlive/foopero también ../texlive/barao hacia /usr/./local/texlive/whatevero a los /some/other/symlinkcuales es un enlace simbólico que apunta /usr/local/texlive, etc. .

Stéphane Chazelas
fuente
0

Ir a la ruta de acceso y establecer la configuración de ruta

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf
wallance
fuente
Como se trata de caminos como usr/local/binese grep, este grep -Ees el camino a seguir. De lo contrario, no habría resultados coincidentes. También hen lsno sirve a ningún propósito aquí! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Para más ver man lsoman grep
ss_iwe