automatiza o processo de consertar todos os links quebrados

5

Existem muitos links quebrados no meu sistema. Eu escrevi um script para vincular todos os links quebrados. Mas, depois que os scripts forem executados, o find me mostrará novamente que os links ainda existem.

Este é o meu código:

find /home/saman -lname '/home/saman/*' -exec \
   sh -c 'ln -snf "/home$(readlink "$0")" "$0"' {} \;

Depois de executar o comando acima, pesquiso links quebrados e ainda os localizo:

find . -type l | xargs file | grep broken 

O que estou fazendo de errado?

    
por Saman 04.04.2015 / 07:32

2 respostas

5

O primeiro problema é que o comando find encontrará apenas links que usaram caminhos completos, não relativos. Para ilustrar:

$ ln -s /home/terdon/foo/NonExistantFile foo
$ ln -s NonExistantFile bar

$ tree
.
|-- bar -> NonExistantFile
'-- foo -> /home/terdon/foo/NonExistantFile

No exemplo acima, criei dois links quebrados. O primeiro usou um caminho absoluto e o segundo, um relativo. Se eu tentar o seu comando find (com o comando echo de relinking em vez de executá-lo para que possamos ver o que está fazendo), apenas um dos dois será encontrado:

$ find . -lname '/home/terdon/*' -exec \
    sh -c 'echo ln -snf "/home$(readlink "$0")" "$0"' {} \; 
ln -snf /home/home/terdon/foo/NonExistantFile ./foo

A segunda questão é que o seu caminho está errado. Você está recriando links como "/home$(readlink "$0")" "$0" . O comando readlink já mostrará o caminho completo, então adicionar /home a ele resultará em /home/home/... , que não é o que você deseja.

Mais importante, o que você está tentando não é possível. Se um link for quebrado, isso significa que seu destino não existe. Como o alvo não existe, você não pode simplesmente vincular novamente o arquivo, não há lugar para vinculá-lo a . A única coisa que você pode fazer é recriar o alvo do link. No entanto, é improvável que isso seja muito útil, pois isso simplesmente faria com que seus links quebrados apontassem para arquivos novos e vazios. Se isso é realmente o que você quer fazer, você poderia tentar

 find . -type l -exec sh -c 'touch "$(readlink "{}")" ' \; 

Finalmente, você pode querer criar um script mais complexo que i) encontre todos os links quebrados ii) procure em sua máquina arquivos com o mesmo nome que o destino do link iii) apresente uma lista deles e iv) pergunta-lhe qual deles deve agora vincular.

    
por 04.04.2015 / 11:28
0

There are lots of broken links in my system. I wrote a script to relink all broken links. But, after the scripts runs, find would again show me that the links still exists...

Este one liner pode ser de interesse nos sistemas GNU Linux. Eu acredito que veio do @Giles, mas não consigo encontrar a referência no momento.

find -xtype l -delete

Ele encontra e exclui recursivamente links quebrados.

    
por 07.07.2018 / 03:19