Sugiro strongmente que não use find -L
para a tarefa (veja abaixo a explicação). Aqui estão algumas outras maneiras de fazer isso:
-
Se você quiser usar um método "pure
find
", ele deve ser assim:find . -xtype l
(
xtype
é um teste realizado em um link desreferenciado) Isso pode não estar disponível em todas as versões defind
, no entanto. Mas há outras opções também: -
Você também pode executar
test -e
no comandofind
:find . -type l ! -exec test -e {} \; -print
-
Mesmo alguns truques de
grep
poderiam ser melhores (ou seja, mais seguros ) do quefind -L
, mas não exatamente como os apresentados na pergunta (em todas as linhas de saída, incluindo nomes de arquivos):find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
O truque find -L
citou por solo de commandlinefu parece legal e hacky, mas tem uma armadilha muito perigosa : Todas as ligações simbólicas são seguidas. Considere o diretório com os conteúdos apresentados 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 os /usr/share/
também serão pesquisados (e isso pode demorar muito) 1 . Para um comando find
que é "imune a links de saída", não use -L
.
1 Isso pode parecer um pequeno inconveniente (o comando "apenas" demorará a percorrer todo o /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 apontam apenas para lugares apropriados quando você entra no chroot. Também lembro que alguns gerenciadores de inicialização usavam links simbólicos em /boot
que faziam sentido apenas em uma fase inicial de inicialização, quando a partição de inicialização era montada como /
.
Então, se você usar o comando find -L
para encontrar e excluir links simbólicos quebrados de algum diretório aparentemente inofensivo, você pode até quebrar o sistema ...