listar archivos por destino de enlace simbólico

23

¿Cómo obtengo la lista de archivos (y luego hago algo con esa lista) al filtrar a través del nombre de destino del enlace simbólico y no el nombre del enlace simbólico? Por ejemplo, de la siguiente lista, solo me interesan los primeros cuatro archivos (el destino contiene bar):

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc
wilkie mate
fuente

Respuestas:

31

Puede usar find para recuperar todos los archivos de tipo enlace simbólico y agregar la -ilnameopción de buscar por nombre del destino del enlace. Esto funciona igual que -inamepara el nombre de destino del enlace en lugar del nombre del enlace.

find -type l -ilname "*bar*"

Eso todavía imprimirá el nombre del enlace, no el objetivo. Si desea imprimir los nombres de los objetivos, intente esto:

find -type l -ilname "*bar*" -printf "%l\n"

U obtener una lssalida de estilo completo

find -type l -ilname "*bar*" -ls

Lo que quiere decir con " hacer algo con la lista " no está claro, pero si desea operar en los archivos de enlace, puede usar el -execargumento para encontrar:

find -type l -ilname "*bar*" -exec touch {} \;

Pero si necesita operar en los objetivos del enlace, deberá usar el -printfpara obtener los valores objetivo y luego xargso algún bucle para operar. Podrías hacer algo como esto:

find -type l -printf "%l\n" | grep bar | xargs touch

... que también muestra cómo usar en greplugar de find -ilnamehacer coincidir su nombre, aunque podría hacerlo de cualquier manera.

Caleb
fuente
gracias Caleb! Respondiste completamente a mi pregunta inmediata y también cubriste algunos casos de canal lateral que definitivamente usaré también.
Matt Wilkie
1
alguna idea de por qué esto find /dev/disk/ -type l -ilname "*sde*"no funciona?
Acuario Power
Requiere GNU find.
ceving