Por Que o find Não Retorna os Resultados Esperados? Aqui Está Como Corrigir

Se você já executou o comando find em seu sistema baseado em Unix, pode ter encontrado uma situação frustrante em que o comando falha em localizar arquivos que você sabe que estão presentes. Por exemplo, você pode querer buscar arquivos de script de shell e, apesar de ter certeza de que eles existem, a saída está vazia. Este problema comum muitas vezes surge de mal-entendidos sobre como o comando find interpreta caracteres coringa. Vamos analisar o problema e descobrir as soluções que podem colocar sua busca de volta nos trilhos.

O Problema: find Não Funcionando Como Esperado

Considere este comando que você pode ter tentado:

$ find /usr -name *.sh

Este comando é destinado a buscar todos os arquivos com a extensão .sh no diretório /usr. No entanto, se você constatar que nenhum resultado aparece, pode se perguntar: Por que o find não está funcionando?

Você sabe que os scripts estão lá; por exemplo, quando você executa:

$ ls /usr/local/lib/*.sh

Você pode ver arquivos como tclConfig.sh e tkConfig.sh. Então, o que está dando errado com seu comando find?

Compreendendo o Problema

A principal questão em jogo é como o shell do comando interpreta o caractere coringa *.sh. Especificamente, se houver arquivos em seu diretório atual que correspondam a *.sh, o shell expande esse caractere coringa antes que find tenha a chance de agir. Isso pode levar a comportamentos inesperados:

  1. Expansão de Coringa

    • Se arquivos .sh existirem em seu diretório atual, por exemplo, tkConfig.sh, digitar find /usr -name *.sh fará com que ele seja expandido para find /usr -name tkConfig.sh, limitando efetivamente sua busca apenas a esse arquivo.
  2. Erros de Sintaxe

    • Se vários arquivos correspondem, find pode gerar um erro de sintaxe devido a argumentos ambíguos:
      find: bad option tkConfig.sh
      

Solução 1: Colocando o Coringa entre Aspas

Para evitar que o shell expanda o caractere coringa antes de passá-lo para find, você pode colocar o caractere coringa entre aspas:

  • Use aspas duplas:
    $ find /usr -name "*.sh"
    
  • Ou use aspas simples:
    $ find /usr -name '*.sh'
    

Colocando *.sh entre aspas, você está instruindo o shell a passar aquele argumento como está para find, permitindo assim que ele procure todos os arquivos .sh no diretório especificado.

Outra razão potencial pela qual o find pode não funcionar como esperado é a presença de links simbólicos no diretório /usr ou seus subdiretórios. Por padrão, o find não segue links simbólicos. Se você suspeitar que este seja o caso, pode usar a opção -follow:

$ find /usr -follow -name '*.sh'

Este comando permite que o find percorra links simbólicos e busque os arquivos desejados.

Conclusão

Em resumo, se você descobrir que o comando find não está produzindo os resultados esperados ao buscar scripts de shell, é provável que seja devido à expansão de coringas ou à presença de links simbólicos. Sempre lembre-se de colocar seus coringas entre aspas para evitar expansões prematuras e, se necessário, use a opção -follow. Ao empregar essas estratégias, você pode localizar seus scripts de shell com sucesso e aprimorar sua proficiência na linha de comando!

Boas Pesquisas!

Agora você está pronto para enfrentar o comando find com confiança! Se você tiver alguma dúvida ou questões adicionais, sinta-se à vontade para deixá-las nos comentários abaixo.