Links simbólicos não são rastreados, então você terá que realizar uma pesquisa exaustiva. Além disso, links simbólicos são textuais, então eles continuam “existentes” mesmo se o sistema de arquivos em que eles residem for desmontado (e eles podem ter um destino diferente se montados em um lugar diferente ou se você renomear diretórios). Portanto, o máximo que você pode fazer é encontrar os links simbólicos apontando para um determinado arquivo (ou diretório), digamos /target
, em uma hierarquia de diretórios específica, digamos /haystack
.
(Note que eu suponho que você esteja realmente procurando links simbólicos para um diretório em particular. Encontrando links simbólicos apontando para um diretório (isto é, um arquivo ou subdiretório daquele diretório) diretório) ou através de um diretório (ou seja, que pode se tornar pendente se você remover o diretório) são problemas muito mais difíceis.)
Com algumas versões do find (por exemplo, no Linux, no FreeBSD ou no Mac OS X), você pode facilmente procurar links simbólicos cujo alvo seja /target
:
find -L /haystack -xtype l -samefile /target
Em sistemas cujo comando find
não possui o -samefile
primary, você pode usar ksh ou bash, se disponível. Remova -xtype
se também não for suportado; então o comando também listará o alvo em si (ou qualquer link para ele).
find -L /haystack -xtype l -exec ksh -c '
for x; do [[ $0 -ef $x ]] && printf "%s\n" "$x"; done
' /target {} +
Fazer isso com apenas ferramentas POSIX é muito mais difícil, devido à falta de maneiras POSIX de testar o mesmo arquivo ou obter informações sobre links simbólicos. Aqui está uma solução para diretórios; ele assume que não há novas linhas em nenhum nome de arquivo.
find /haystack -type l -exec sh -c 'cd -P -- "$0" && pwd' {} \; |
grep -Fx "$(cd -P /target && pwd)"
E aqui está minha solução zsh obrigatória.
echo /haystack/**/*(@e\''[[ $REPLY -ef /target ]]'\')