Você deseja um programa chamado realpath
, usado em conjunto com find
.
Por exemplo:
find . -type l -exec realpath {} \; | grep -v "^$(pwd)"
Eu freqüentemente movo árvores de diretórios para outros locais ou copio seus tarballs para outras máquinas, e gostaria de ter um método para verificar se quaisquer links simbólicos em uma árvore de diretórios A apontam para locais fora de < em> A uma vez que estes serão quebrados no diretório movido / copiado.
Você deseja um programa chamado realpath
, usado em conjunto com find
.
Por exemplo:
find . -type l -exec realpath {} \; | grep -v "^$(pwd)"
Use bindfs para criar outra visualização dessa árvore de diretórios.
mkdir /tmp/view
bindfs /some/directory /tmp/view
Em seguida, use o utilitário symlinks (enviado por muitas distribuições ou compilado de source ) para detectar links entre sistemas de arquivos.
symlinks -r /tmp/view | sed -n 's/^\(absolute\|other_fs\): //p'
(Observe que analisar a saída supõ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 subcadeia ->
.) Esse mesmo utilitário também pode converter links simbólicos absolutos em relativos (mas você d quero fazer isso a partir da localização original).
Com zsh:
cd -P -- "$dir"
for i (**/*(ND@)) [[ $i:A = $PWD/* ]] || [[ $i:A = $PWD ]] || print -r -- "$i => $i:A"
Agora, se o diretório for /foo
e você tiver /foo/bar
, um link simbólico para /foo/baz
, esse é um link cujo destino é / foo, mas, uma vez movido, o link ainda será quebrado. também deseja associar links simbólicos a caminhos absolutos.
Mas, mesmo assim, um bar => ../foo/baz
em /foo
seria um problema (falso negativo), assim seria um a => b
onde b
é um link simbólico fora da árvore (falso positivo, dependendo de como você deseja olhe para isso)
Eu tive que ajustar um pouco a resposta dada pelo @bahamat para fazer isso funcionar.
A versão fornecida simplesmente relatou a localização absoluta ofensiva, mas não o link simbólico que aponta para ela.
Aqui está o que eu usei (tenho certeza que pode ser melhorado):
for f in $(find . -type l ); do echo -n $(realpath $f) && echo -n "|" && echo $f ; done | grep -v "^$(pwd)" | cut -d \| -f 2
GNU coreutils provém realpath
, que resolve links simbólicos. Com isso, você pode comparar o destino de cada link simbólico para o diretório de trabalho atual com algo como:
#!/bin/bash
find . | while read filename
do
if realpath $filename | grep -E "^$PWD" > /dev/null
then
echo 'this file is safe'
else
echo 'this file links externally'
fi
done
Tags symlink