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./proc/XXX/exe
link está quebrado. Para isso, usetest -e "$(readlink /proc/XXX/exe)"
.find . -xtype l
significa "encontre todos os links simbólicos cujos arquivos de destino (finais) são links simbólicos". Mas o destino final de um link simbólico não pode ser um link simbólico; caso contrário, ainda podemos seguir o link e este não é o destino final. Como não existem links simbólicos, podemos defini-los como outra coisa, ou seja, links simbólicos quebrados.l
, é menos confuso para mim.-L
hack, mas sim à remoção (cega) de links simbólicos quebrados em geral.O
symlinks
comando de http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz pode ser usado para identificar links simbólicos com uma variedade de características. Por exemplo:fonte
symlinks
está pré-instalado no Fedora.Como o rozcietrzewiacz já comentou,
find -L
pode ter consequências inesperadas ao expandir a pesquisa em diretórios com links simbólicos, portanto, não é a abordagem ideal. O que ninguém mencionou ainda é queé o comando mais conciso e logicamente idêntico ao
Nenhuma das soluções apresentadas até agora detectará links simbólicos cíclicos, que é outro tipo de quebra. Esta pergunta trata da portabilidade. Para resumir, a maneira portátil de encontrar links simbólicos quebrados, incluindo links cíclicos, é:
Para mais detalhes, consulte esta pergunta ou ynform.org . Obviamente, a fonte definitiva para tudo isso é a documentação do findutils .
fonte
find -L
armadilha, bem como links cíclicos. +1-xtype
não é especificado no POSIX e de fato se você olhar parafind(1)
no MacOS ele tem-type
, mas não-xtype
.Eu acredito que adicionar a
-L
flag ao seu comando permitirá que você se livre do grep:http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
do homem:
fonte
Se você precisar de um comportamento diferente, independentemente de o link estar quebrado ou cíclico, também poderá usar% Y com o comando find:
Este exemplo é copiado desta postagem (site excluído) .
Referência
fonte
find
comando não suportaxtype
pode ser derivada a partir desta:find . type l -printf "%Y %p\n" | grep -w '^N'
. Como Andy me abordou com a mesma idéia (básica) em seu roteiro, fiquei relutante em escrevê-lo como resposta separada. :)Eu uso isso para o meu caso e funciona muito bem, pois conheço o diretório para procurar links simbólicos quebrados:
e minha pasta inclui um link para,
/usr/share
mas não o atravessa. Links entre dispositivos e aqueles que são válidos para chroots etc. ainda são uma armadilha, mas para o meu caso de uso é suficiente.fonte
Resposta simples e simples, que é uma variação da versão do OP. Às vezes, você só quer algo fácil de digitar ou lembrar:
fonte
find -L . -type l |xargs symlinks
fornecerá informações se o link existe ou não, por arquivo encontrado.fonte
Isso imprimirá os nomes dos links simbólicos quebrados no diretório atual.
Trabalha em Bash. Não conheço outras conchas.
fonte