localiza todos os links simbólicos em uma árvore de diretórios apontando para fora dessa árvore

8

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.

    
por Marcus Junius Brutus 04.10.2012 / 23:17

5 respostas

7

Você deseja um programa chamado realpath , usado em conjunto com find .

Por exemplo:

find . -type l -exec realpath {} \; | grep -v "^$(pwd)"
    
por 04.10.2012 / 23:43
2

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).

    
por 05.10.2012 / 02:14
2

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)

    
por 04.10.2012 / 23:34
2

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 
    
por 09.09.2016 / 18:06
1

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
    
por 04.10.2012 / 23:33

Tags