Links simbólicos são uma ótima maneira de organizar seus arquivos, mas não são perfeitos. Os links simbólicos são bastante frágeis e é fácil acabar com links que apontam para arquivos inexistentes. O programa find pode ajudá-lo a resolver esse problema, mas existe uma ferramenta de terceiros que faz o trabalho ainda melhor.
O que é um link simbólico quebrado e por que isso é importante?
Um link simbólico quebrado aponta para um arquivo que não existe. Pode ter acontecido de duas maneiras:
- Vinculando a um arquivo que nunca existiu. Você pode tentar fazer isso passando um nome de arquivo inexistente para ln, por exemplo, ln -s arquivo não existe.
- Vincular a um arquivo existente e, em seguida, excluir esse arquivo, por exemplo, ln -s arquivo link para arquivo; arquivo rm.
Esses links simbólicos quebrados às vezes são chamados de ‘links pendentes’ e podem ser problemáticos porque provavelmente quebrarão alguma outra coisa – ou seja, o que quer que originalmente pretendesse usá-los. Os programas nem sempre lidam com links quebrados de forma consistente:
ls nem sequer distingue um link quebrado de um link normal, tornando-os muito mais difíceis de detectar de passagem.
Muitas ferramentas GNU produzem uma mensagem de erro um pouco confusa: “Muitos níveis de links simbólicos”. Isso é explicado na documentação da função de biblioteca aberta subjacente, que descreve o erro ELOOP:
[ELOOP]
Muitos links simbólicos são encontrados na tradução do nome do caminho. Isso é considerado um indicativo de um link simbólico em loop.
Felizmente, o comando file apresenta um erro mais útil:
Isso faz sentido porque o objetivo do comando file é fornecer informações sobre o tipo de arquivo, enquanto wc e most tentam realizar outras tarefas no conteúdo desse arquivo.
Links quebrados podem sobrecarregar seu sistema de arquivos, ocupando espaço sem nenhum benefício. Eles também podem produzir resultados confusos ou simplesmente erros indesejados quando programas que operam em muitos arquivos os encontram. É fácil perder o controle de um link quebrado em um diretório profundo e depois ter problemas com find ou grep recursivo.
Alguns programas indicam links quebrados, como o eza, que os mostra em vermelho:
Como encontrar links pendentes usando o comando find
O comando find é um grampo confiável, perfeito para todos os tipos de pesquisas de arquivos. Se você deseja arquivos que foram alterados recentemente, arquivos pertencentes a um usuário específico ou diretórios vazios, existe uma maneira de usar find que o ajudará. E isso inclui a busca por links simbólicos:
find . -type l
A opção -type l restringe as correspondências apenas a links simbólicos, por isso ajuda a restringir a pesquisa, mas o próximo desafio é identificar quais desses links estão quebrados. A solução depende de qual versão do find você está usando.
O find GNU moderno é o mais útil porque suporta uma opção -xtype:
find . -xtype l
A opção -xtype significa, efetivamente, “resolver cadeias de links simbólicos antes de testar esse tipo”. Como um arquivo só pode permanecer um link se essa resolução falhar, os arquivos resultantes deverão ser links quebrados.
Versões mais antigas do find, incluindo aquela instalada no macOS Tahoe, podem não suportar esse argumento, então você precisará de uma alternativa. Felizmente, existe a opção -L. Isso faz o mesmo que -xtype, mas não verifica o tipo do arquivo; ele apenas tenta resolver quaisquer links. Você ainda precisará usar a verificação -type em conjunto com ela:
find -L . -type l
A outra grande diferença, entretanto, é que -L segue links simbólicos durante a descida recursiva do find aos diretórios. Se você tiver um link estranho em um diretório profundo que aponta para / (ou seja, a raiz), você acabará pesquisando em todo o sistema de arquivos. Você provavelmente não deseja fazer isso, e é por isso que -L não é o padrão.
Uma solução para isso é usar find para encontrar todos os links simbólicos e, em seguida, usar a opção -exec para verificar se cada arquivo existe:
find . -type l -exectest ! -e {} ; -print
Este comando é um pouco complicado, mas funciona. A opção “-type l” encontra links, como antes, então “-exec” chama o comando de teste usando o sinalizador -e para localizar arquivos que não existem. Finalmente, a parte “print” gera o nome do arquivo.
Se você está tentando encontrar links simbólicos quebrados em um Linux moderno, “find -xtype l” deve ser adequado. Na verdade, você pode usar o comando find para excluir links simbólicos quebrados, novamente, aproveitando a opção -exec:
find . -xtype l -exec rm {} ; Mas você vai querer verificar esses links primeiro e, novamente, o comando equivalente do macOS fica ainda mais estranho. Você pode querer configurar um alias ou criar uma função shell para evitar ter que lembrá-lo. Ou você poderia usar uma alternativa melhor …
Usando o programa de links simbólicos para encontrar e corrigir links quebrados
Se você achar os métodos acima difíceis de manejar ou se lidar regularmente com problemas de links simbólicos, considere a ferramenta de links simbólicos. Este pequeno programa C pode localizar vários tipos de links problemáticos, incluindo links quebrados.
Por ser tão simples, não existe um método de instalação sofisticado, então você precisará compilá-lo a partir do código-fonte. Felizmente, sua simplicidade também significa que você não deverá ter problemas.
Baixe o repositório GitHub do programa e siga o processo clássico de construção de três etapas:
./configure
make
make install
Os usuários do macOS não terão um compilador C por padrão e precisarão instalar as ferramentas de linha de comando da Apple para construir links simbólicos. Comece correndo xcode-select –install.
Com o programa instalado, você está pronto para executá-lo passando um caminho de diretório para pesquisa, por exemplo:
symlinks ~/
Você pode não obter nenhum resultado com este comando; por padrão, ele não recorre aos subdiretórios. A opção -r faz isso e provavelmente descobrirá muitos links problemáticos em seu sistema de arquivos. Na verdade, quando executei “symlinks -r ~/ | wc -l” pela primeira vez, meu sistema relatou um enorme número de 16.617! Meus links simbólicos estão claramente muito mal organizados.
No entanto, nem todos esses são links quebrados. links simbólicos relatam quatro tipos de links imperfeitos:
- Quebrado (pendurado).
- Absoluto: tais links podem causar problemas com pontos de montagem.
- Confuso: links com arquivos . ou / em seu caminho.
- Longo: links com desnecessários .. em seu caminho. Reportado apenas quando a opção -s é usada.
Esses problemas surgem porque o programa que você usa para criar links, ln, não verifica ou normaliza realmente o caminho que você passa. O melhor que oferece é a opção -w, que avisa se você criar um link pendente, mas ainda assim segue em frente e o cria. O comando ln não oferece proteção contra esses outros tipos de links problemáticos.
links simbólicos também podem ajudá-lo a limpar esses links, com dois tipos de correção.
Primeiro, existe a opção -d, que remove links pendentes. Se você quer uma vida fácil, esta é a maneira mais rápida de se livrar desses arquivos inúteis. No entanto, você pode querer revisar primeiro a lista de links pendentes, pois pode ser possível repará-los manualmente. Por exemplo, se você renomeou um diretório e quebrou um conjunto de links ao fazer isso, poderá reconstruir cada link manualmente.
A segunda opção é -c, e isso corrige links absolutos, links confusos e – com a opção -s – links longos. Esta é uma opção bastante nuclear, na minha opinião; esses tipos de links simbólicos são menos problemáticos do que links totalmente quebrados. Eu só me preocuparia com essa opção se usasse regularmente diferentes pontos de montagem para meus sistemas de arquivos, para evitar problemas com links absolutos.