Eu sugiro fortemente não usar find -L
para a tarefa (veja abaixo para explicação). Aqui estão algumas outras maneiras de fazer isso:
Se você deseja usar um find
método " puro ", deve parecer com o seguinte:
find . -xtype l
( xtype
é um teste realizado em um link não referenciado). Isso pode não estar disponível em todas as versões de find
. Mas existem outras opções também:
Você também pode executar test -e
de dentro do find
comando:
find . -type l ! -exec test -e {} \; -print
Mesmo algum grep
truque poderia ser melhor (ou seja, mais seguro ) do que find -L
, mas não exatamente como o apresentado na pergunta (que aparece em linhas de saída inteiras, incluindo nomes de arquivos):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
O find -L
truque citado por solo do commandlinefu parece bom e hacky, mas tem uma armadilha muito perigosa : todos os links simbólicos são seguidos. Considere o diretório com o conteúdo apresentado abaixo:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
Se você executar find -L . -type l
nesse diretório, todos /usr/share/
também serão pesquisados (e isso pode levar muito tempo) 1 . Para um find
comando "imune a links de saída", não use-L
.
1 Isso pode parecer um pequeno inconveniente (o comando "levará" muito tempo para percorrer tudo /usr/share
) - mas pode ter consequências mais graves. Por exemplo, considere ambientes chroot: eles podem existir em algum subdiretório do sistema de arquivos principal e conter links simbólicos para locais absolutos. Esses links podem parecer quebrados para o sistema "externo", porque eles só apontam para lugares apropriados quando você entra no chroot. Lembro-me também de que algum carregador de inicialização usava links simbólicos sob /boot
esse sentido apenas em uma fase inicial de inicialização, quando a partição de inicialização foi montada como /
.
Portanto, se você usar um find -L
comando para encontrar e excluir links simbólicos quebrados de algum diretório com aparência inofensiva, poderá até quebrar seu sistema ...
-type l
é redundante, uma vez que-xtype l
irá operar como-type l
em não-links. Então,find -xtype l
é provavelmente tudo que você precisa. Obrigado por esta abordagem.