Como encontrar todos os links flexíveis (links simbólicos) no diretório atual?

10

A pergunta está relacionada ao script de shell em bash.

Como verificar com um script quais arquivos no diretório atual são links flexíveis?

Caso eu tenha usado o termo errado, quando digo links flexíveis , refiro-me aos arquivos criados usando ln -s.

A única coisa que consegui pensar é avaliar ls -lacomo uma expressão e analisar seus resultados, mas obviamente essa não é a melhor solução.

bguiz
fonte
1
Eles são chamados de "links simbólicos" (em oposição a "links físicos").
Pausado até novo aviso.
Righto, eu sabia que provavelmente tinha entendido errado o termo, obrigado pelo
aviso
O link suave também é bom, mas com um espaço. :-) ( pt.wikipedia.org/wiki/Symbolic_link )
Arjan 17/11

Respostas:

14

Veja 'expressões condicionais' em man bash- neste caso você quer -h:

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done
Polsy
fonte
2
faqs.org/docs/bashman/bashref_68.html - Para expressões condicionais, é melhor ler do que a página de manual.
Manos Dilaverakis
Obrigado @Polsy e @Manos! test -hé o que eu queria!
bguiz
14

Você pode realmente não precisar de um script. Para mostrar qualquer link simbólico apenas na pasta atual, sem recorrer a nenhuma pasta filho:

encontrar . -maxdepth 1 -type l -print

Ou, para obter mais informações, use um dos seguintes:

encontrar . -maxdepth 1 -type l -exec ls -ld {} +
encontrar . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

Para saber se um arquivo é um link simbólico, pode-se usar readlink, o que não produzirá nada se não for um link simbólico. O exemplo a seguir não é muito útil, mas mostra como readlinkignora arquivos e pastas normais. Use um dos seguintes:

encontrar . -maxdepth 1 -exec readlink {} +
encontrar . -maxdepth 1 -print0 | xargs -0 readlink

Observe que o acima -exec ... +e xargs ...são muito mais rápidos que -exec ... \;. Gostar:

localização de hora / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
0m0.372s reais
usuário 0m0.087s
sys 0m0.163s

localização de hora / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
0m0.013s reais
usuário 0m0.004s
sys 0m0.008s

localizador de horário / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
0m0.012s reais
usuário 0m0.004s
sys 0m0.009s
Arjan
fonte
Gostei mais da resposta de Polsy, ainda com +1 para você, pois talvez eu precise fazer isso fora de um shell script algum dia.
bguiz
1
Você não precisa necessariamente de xargs. Você poderia apenas usar o find. -maxdepth 1 -exec readlink {} \;
Stib
Verdadeiro, @stib, mas xargsé muito mais rápido no meu Mac; veja minha edição. Mas eu aprendi algo novo hoje: há também +, em vez de \;(Embora alguns afirmam que isso tem / teve problemas com grep.)
Arjan