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

10

A pergunta está relacionada ao shell-scripting em bash .

Como verificar com um script quais arquivos dentro do diretório atual são soft links?

Caso eu tenha usado o termo errado, quando eu disser soft links , refiro-me aos arquivos criados usando ln -s .

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

    
por bguiz 16.11.2009 / 11:44

2 respostas

14

Veja 'EXPRESSÕES CONDICIONAIS' em man bash - em Nesse caso, você quer -h :

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done
    
por 16.11.2009 / 12:11
14

Você pode não precisar de um script. Para mostrar links simbólicos apenas na pasta atual, sem recursar em nenhuma pasta filha:

find . -maxdepth 1 -type l -print

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

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

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

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

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

time find /usr/bin -maxdepth 1 -type l -exec ls -ld {} \;
real 0m0.372s
user 0m0.087s
sys  0m0.163s

time find /usr/bin -maxdepth 1 -type l -exec ls -ld {} +
real 0m0.013s
user 0m0.004s
sys  0m0.008s

time find /usr/bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
real 0m0.012s
user 0m0.004s
sys  0m0.009s
    
por 16.11.2009 / 16:12