Como eu vejo quais links simbólicos existem para um determinado diretório?

4

Eu quero fazer algumas tarefas domésticas em um diretório, e eu quero ver se um determinado diretório tem quaisquer links simbólicos apontando para ele. Posso facilmente ver em qual diretório um link simbólico aponta, mas agora quero ver o relacionamento em sentido inverso.

    
por user394 02.11.2010 / 16:37

2 respostas

5

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 ]]'\')
    
por 02.11.2010 / 20:22
0

Você precisará pesquisar em / usando encontre (1) e -type l opção para identificar todos os links, seguido por um grep (1) para isolar os links de interesse.

    
por 02.11.2010 / 17:23

Tags