Encontre todos os links absolutos em uma árvore de diretórios

8

Como detecto (recursivamente) todos os links simbólicos em um diretório que identificam seu destino de maneira absoluta e não relativa?

Como esses links provavelmente quebram quando uma árvore de diretórios inteira é movida, eu gostaria de ter uma maneira de identificá-los.

Até links relativos podem quebrar se a árvore de diretórios for movida (se eles apontarem para fora da raiz da árvore de diretórios), mas acho que isso é abordado nesta questão .

Marcus Junius Brutus
fonte

Respostas:

15

Para encontrar links absolutos, você pode usar finda -lnameopção 's', caso seja findcompatível com isso (está disponível pelo menos no GNU find, no FreeBSD e no macOS):

find . -type l -lname '/*'

Isso pede findpara imprimir os nomes dos arquivos que são links simbólicos e cujo conteúdo (destino) corresponde /*usando o shell globbing.

Estritamente falando, o POSIX especifica que nomes de caminho absolutos começam com um /ou três ou mais/ ; para combinar com isso, você pode usar

find . -lname '/*' ! -lname '//*' -o -lname '///*'

Em que sistemas // foo / bar é diferente de / foo / bar? tem mais detalhes sobre isso.

(Agradecemos a Sato Katsura por apontar que -lnameé específico do GNU, a fd0 por mencionar que também está realmente disponível pelo menos no FreeBSD e no macOS, e a Stéphane Chazelas por trazer a definição absoluta de nome de caminho do POSIX.)

Stephen Kitt
fonte
Eu estava prestes a postar: o find ./ -t l -exec ls -l {} \;que deveria ser uma alternativa segura. Seria fácil analisar sua saída, fazer o que for necessário.
Centimane 9/09/16
@Centimane see Por que não analisar ls? ...
Stephen Kitt
7

Você pode achar o symlinksutilitário útil:

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

E pode corrigir os links para você. Aqui com -tpara dizer o que faria :

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas
Stéphane Chazelas
fonte