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 .
Respostas:
Para encontrar links absolutos, você pode usar
find
a-lname
opção 's', caso sejafind
compatível com isso (está disponível pelo menos no GNUfind
, no FreeBSD e no macOS):Isso pede
find
para 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 usarEm 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.)fonte
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.ls
? ...Você pode achar o
symlinks
utilitário útil:E pode corrigir os links para você. Aqui com
-t
para dizer o que faria :fonte