Como encontrar todos os links simbólicos apontando para qualquer arquivo / diretório dentro de um determinado diretório

14

Nesta questão ou nesta (por exemplo), você obterá soluções sobre como procurar links simbólicos que apontam para um determinado diretório (vamos chamá-lo /dir1), enquanto eu estou interessado em links simbólicos que possivelmente apontam para qualquer arquivo / pasta dentro /dir1.

Quero excluir esse diretório, mas não tenho certeza se posso fazê-lo, pois em outro diretório (vamos chamá-lo /dir2), posso ter links simbólicos apontando para as partes internas do /dir1.

Além disso, eu posso ter criado esses links simbólicos usando caminhos absolutos ou relativos. Minha única ajuda é que eu sei que os links simbólicos que quero verificar estão em um sistema de arquivos montado /dir2.

Antonello
fonte

Respostas:

15

Você pode encontrar todos os links simbólicos usando:

find / -type l 

convém executar isso como root para chegar a todos os lugares do disco.

Você pode expandi-las usando readlink -fpara obter o caminho completo do link e conseguir grepa saída no diretório de destino que deseja excluir:

find / -type l -exec readlink -f {} + | grep -F /dir2

O uso find / -type l -printf '%l\n'não funciona, pois você obtém links relativos, como o ../tmp/xyzque pode estar apontando para o diretório de destino, mas não são correspondentes porque não foram totalmente expandidos.

Anthon
fonte
1
No caso de subárvore, pode ser útil seguir links simbólicos:find -L /subtree -xtype l -exec readlink -f {} +
ruvim 30/11
3

No meu caso, a resposta aceita não foi útil (porque não produziu a fonte do link). Aqui está o que funcionou para mim.

Eu trabalhei em torno dele usando duas -execcláusulas:

find /home/ -type l -exec readlink -nf {} ';' -exec echo " -> {}" ';' | grep "/dir2"
Dorian Marchal
fonte
1

Com zsh:

printf '%s\n' /dir2/**/*(D@e'([[ $REPLY:P = /dir1(/*|) ]])')
Stéphane Chazelas
fonte