¿Cómo encontrar todos los enlaces blandos (enlaces simbólicos) en el directorio actual?

10

La pregunta se refiere al scripting de shell en bash.

¿Cómo verificar con un script qué archivos dentro del directorio actual son enlaces blandos?

En caso de que haya usado un término incorrecto, cuando digo enlaces suaves , me refiero a los archivos creados con ln -s.

Lo único que he logrado pensar es evaluar ls -lacomo una expresión y analizar sus resultados, pero obviamente esta no es la mejor solución.

bguiz
fuente
1
Se les conoce como "enlaces simbólicos" (en oposición a "enlaces duros").
Pausado hasta nuevo aviso.
Righto, supe que probablemente tiene el término equivocado, gracias por el cara a cara
bguiz
El enlace suave también está bien, pero con un espacio. :-) ( en.wikipedia.org/wiki/Symbolic_link )
Arjan

Respuestas:

14

Es posible que realmente no necesite un script. Para mostrar los enlaces simbólicos solo en la carpeta actual, sin recurrir a ninguna carpeta secundaria:

encontrar . -maxdepth 1 -type l -print

O, para obtener más información, use uno de:

encontrar . -maxdepth 1 -tipo l -exec ls -ld {} +
encontrar . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

Para saber si un archivo es un enlace simbólico, se puede usar readlink, que no generará nada si no es un enlace simbólico. El siguiente ejemplo no es muy útil, pero muestra cómo readlinkignora los archivos y carpetas normales. Use uno de:

encontrar . -maxdepth 1 -exec readlink {} +
encontrar . -maxdepth 1 -print0 | xargs -0 readlink

Tenga en cuenta que los anteriores -exec ... +y xargs ...son mucho más rápidos que -exec ... \;. Me gusta:

hora find / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
0m0.372s reales
usuario 0m0.087s
sys 0m0.163s

tiempo find / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
0m0.013 reales
usuario 0m0.004s
sys 0m0.008s

tiempo find / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
0m0.012s reales
usuario 0m0.004s
sys 0m0.009s
Arjan
fuente
Me gustó la respuesta de Polsy, todavía +1 para ti, ya que algún día podría necesitar hacerlo fuera de un script de shell.
bguiz
1
No necesariamente necesitas xargs. Podrías usar find. -maxdepth 1 -exec readlink {} \;
stib
Es cierto, @stib, pero xargses mucho más rápido en mi Mac; mira mi edición Pero he aprendido algo nuevo hoy: También existe +en lugar de \;(Aunque algunos afirman que esto tiene / tenía problemas con grep.)
Arjan