Eu freqüentemente movo árvores de diretório para outros locais ou copio seus tarballs para outras máquinas, e gostaria de ter um método para verificar se algum link simbólico em uma árvore de diretórios A aponta para locais fora de A, pois eles serão quebrados no arquivo movido / copiado diretório.
8
Use bindfs para criar outra visualização dessa árvore de diretórios.
Em seguida, use o utilitário symlinks (enviado por muitas distribuições ou compilá-lo da fonte ) para detectar links entre sistemas de arquivos.
(Observe que a análise da saída pressupõe que seus links simbólicos e seus destinos não contêm novas linhas, nem os caminhos para links simbólicos contêm a substring
->
.) Esse mesmo utilitário também pode converter links simbólicos absolutos em relativos (mas você deseja fazer isso em a localização original).fonte
Com zsh:
Agora, se o diretório é
/foo
e você tem/foo/bar
um link simbólico/foo/baz
, esse é um link cujo destino está em / foo, mas uma vez movido, o link ainda será quebrado, portanto, convém também associar links simbólicos a caminhos absolutos.Mas mesmo assim, um
bar => ../foo/baz
in/foo
seria um problema (falso negativo), assim como uma => b
whereb
é um link simbólico fora da árvore (falso positivo, dependendo de como você deseja vê-lo)fonte
Eu tive que ajustar um pouco a resposta dada por @bahamat para fazê-lo funcionar.
A versão fornecida simplesmente informava o local absoluto ofensivo, mas não o link simbólico que aponta para ele.
Aqui está o que eu usei (tenho certeza que pode ser melhorado):
fonte
for f in $(find . -type l); do echo $(realpath -m -q $f) '<-' $f; done | grep-v "^$(pwd)"
(mais notavelmente-m
e-q
que filtra links quebrados e não externos)Provas de coreutils GNU
realpath
, que resolvem links simbólicos. Com isso, você pode comparar o destino de cada link simbólico com o diretório de trabalho atual com algo como:fonte
-type l
, nenhuma-r
opção deread
, não IFS higienizado pararead
,$filename
não cotados,$PWD
tratado como uma expressão regular, caminhos com caracteres de nova linha não contabilizados,/foobar
seriam combinados para$PWD
== "/ foo"