¿Cómo veo qué enlaces simbólicos existen para un directory determinado?

Quiero hacer algunas tareas domésticas en un directory, y quiero ver si un directory dado tiene algún enlace simbólico. Puedo ver fácilmente a qué directory apunta un enlace simbólico, pero ahora quiero ver la relación en reversa.

Los enlaces simbólicos no son rastreados, por lo que deberá realizar una búsqueda exhaustiva. Además, los enlaces simbólicos son textuales, por lo que se mantienen "existentes" incluso si el sistema de files en el que residen se desmonta (y pueden tener un objective diferente si se montan en un lugar diferente o si cambian el nombre de los directorys). Entonces, lo máximo que puede hacer es encontrar los enlaces simbólicos que apuntan a un file (o directory) particular, digamos /target , en una jerarquía de directory particular, por ejemplo /haystack .

(Tenga en count que supongo que realmente está buscando enlaces simbólicos a un directory particular. Encontrar enlaces simbólicos que apuntan a un directory (es decir, a un file o subdirectory de ese directory) oa través de un directory (es decir, que pueden quedar colgando si elimina el directory ) son problemas mucho más difíciles).

Con algunas versiones de find (por ejemplo, en (bastante reciente) Linux, FreeBSD o Mac OS X), puede search fácilmente enlaces simbólicos cuyo objective es /target :

 find -L /haystack -xtype l -samefile /target 

En los sistemas cuyo command de find no tiene el -samefile primario, puede usar ksh o bash en su lugar, si está disponible. Quite -xtype si tampoco es compatible; luego, el command también mostrará el objective en sí (o cualquier enlace fijo).

 find -L /haystack -xtype l -exec ksh -c ' for x; do [[ $0 -ef $x ]] && printf "%s\n" "$x"; done ' /target {} + 

Hacer esto con solo herramientas POSIX es mucho más difícil, debido a la falta de forms POSIX para probar el mismo file o para get información sobre enlaces simbólicos. Aquí hay una solución para directorys; asume que no hay nuevas líneas en ningún nombre de file.

 find /haystack -type l -exec sh -c 'cd -P -- "$0" && pwd' {} \; | grep -Fx "$(cd -P /target && pwd)" 

Y aquí está mi solución zsh obligatoria.

 echo /haystack/**/*(@e\''[[ $REPLY -ef /target ]]'\') 

Necesitará search / utilizar find (1) y la opción -type l para identificar todos los enlaces, seguido de un grep (1) para aislar los enlaces de interés.