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

8

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

Como é muito provável que esses links quebrem quando uma árvore de diretórios inteira é movida, eu gostaria de ter uma maneira de identificá-los.

Mesmo os links relativos podem ser quebrados se a árvore de diretórios for movida (se acontecer de eles apontar para fora da raiz da árvore de diretórios), mas acho que isso é endereçado em esta questão .

    
por Marcus Junius Brutus 09.09.2016 / 17:53

2 respostas

14

Para encontrar links absolutos, você pode usar a opção find -lname se o seu find suportar isso (está disponível pelo menos no GNU find , no FreeBSD e no macOS):

find . -type l -lname '/*'

Solicita que find imprima os nomes de arquivos que são links simbólicos e cujo conteúdo (destino) corresponde a /* usando shell globbing.

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

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

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

(Agradecimentos a Sato Katsura por apontar que -lname é específico do GNU, para < um href="https://unix.stackexchange.com/users/105926/fd0"> fd0 por mencionar que na verdade ele também está disponível em pelo menos FreeBSD e macOS, e para Stéphane Chazelas para criar a definição de caminho absoluto POSIX.)

    
por 09.09.2016 / 18:03
7

Você pode encontrar o utilitário symlinks ú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 -t para 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
    
por 09.09.2016 / 18:37

Tags