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 findmé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 -ede dentro do findcomando:
find . -type l ! -exec test -e {} \; -print
Mesmo algum greptruque 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 -Ltruque 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 lnesse diretório, todos /usr/share/também serão pesquisados (e isso pode levar muito tempo) 1 . Para um findcomando "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 /bootesse 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 -Lcomando 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 lirá operar como-type lem não-links. Então,find -xtype lé provavelmente tudo que você precisa. Obrigado por esta abordagem.