Como encontro links simbólicos circulares?

12

Estou trabalhando em um sistema HP-UX e quero descobrir se existem links simbólicos circulares.

Até agora estou usando o comando:

ls -lrt  `find ./ -follow -type l`

Mas só está executando ls -lrt no diretório atual como resultado.

Que comando devo usar para encontrar todos os links simbólicos circulares em um sistema?

Vladimir
fonte
1) Você está obtendo o diretório atual porque o findcomando está apenas imprimindo .ou não imprimindo nada (então você está apenas executando ls -lrtou ls -lrt .) Não conhece o HP-UX o suficiente findpara saber como corrigir isso (talvez exija um explícito -print? ) 2) O que você quer dizer com "circular"? ./a -> ./be ./b -> ./a? Que tal /home/foo/a -> /home? Ou /home/foo/a -> /home/bare /home/bar/b -> /home/foo?
DerfK
Por circular, eu quis dizer qualquer tipo de link que possa criar um loop para todas as opções acima. Estou tentando com -print agora.
Vladimir
Além disso, por que não incluir -followrealmente me dá alguns links reais são resultados?
Vladimir
Sem -follow, findexamina o próprio link, não o arquivo para o qual aponta. Assim, find . -type limprime coisas que são links (porque são -type l) sem sequer olhar para o que apontam (que seriam arquivos ou diretórios ou outros links que apontam para arquivos ou diretórios).
DerfK

Respostas:

18

A página de manual do GNU find diz que todos os achados do POSIX devem detectar loops do sistema de arquivos e emitir mensagens de erro nesses casos, e eu testei

find . -follow -printf ""

no GNU find, que foi capaz de encontrar loops do formulário ./a -> ./be ./b -> ./aimprimir o erro

find: `./a': Too many levels of symbolic links
find: `./b': Too many levels of symbolic links

(isso também funcionou a->b->c->a)

Da mesma forma, loops do formulário ./foo/x -> ..e ./foo/a -> ./bar+ ./bar/b -> ./fooimprimiram os erros

find: File system loop detected; `./foo/a/b' is part of the same file system loop as `./foo'.
find: File system loop detected; `./bar/b/a' is part of the same file system loop as `./bar'.
find: File system loop detected; `./foo/x' is part of the same file system loop as `.'.

Se você quiser fazer algo com a saída que não seja ler, precisará redirecioná-lo do stderr para o stdout e canalizá-lo para algum script que possa analisar as mensagens de erro.

DerfK
fonte
Isso significa que, se houver algum loop, uma mensagem de erro será exibida?
Vladimir
Com o GNU find e -follow, sim.
DerfK
Ok, mas como isso explica a obtenção de apenas um, em lsvez de obter links reais, quando não está sendo usada -follow?
Vladimir
1
É assim que o shell funciona. Você pediu para executar o lscomando usando a saída do seu findcomando. Seu findcomando não imprimiu nada; portanto, seu shell foi executado lssem nada, o que lista o diretório atual.
DerfK
A solução do DerfK também encontra ciclos no Windows 7, invocando-o a partir de um shell cygwin.
quer