grep recursivamente para arquivos específicos

1

Eu tentei usar o grep para encontrar alguns trechos de código em arquivos python que estão espalhados em alguns diretórios / subdiretórios, mas infelizmente minhas tentativas falharam: (

Eu pensei:

grep -r "search-pattern" *.py

deve fazer a mágica, mas falhou com "nenhuma correspondência encontrada", embora existam vários arquivos contendo linhas com o padrão de pesquisa.

Em seguida, tentei o seguinte:

grep -r "search-pattern" .

O que pareceu funcionar, mas também retornou muitos erros para alguns arquivos-c compilados e outras coisas. Obviamente, mais do que eu queria.

Finalmente , depois de muitas pesquisas no Google, descobri:

grep -rn --include="*.py" "search-pattern"

Isso fez o trabalho e encontrou todos os arquivos python que eu estava procurando. Como bônus, ele também imprime os números de linha que contêm o padrão de pesquisa.

Mas um problema permaneceu: alguns erros de "permissão negada". Como me livrar desses? Eu pensei que manipular o grep seria fácil, mas acabou sendo complexo obter bons resultados, com numeração de linhas e sem erros.

Qualquer ajuda seria muito apreciada:)

    
por daniel451 06.11.2014 / 23:05

2 respostas

2

Você está recebendo esses erros de Permission denied porque existem alguns arquivos python que o usuário não tem permissão para ler, então o grep não está não funcionando para esses arquivos (você não pode pesquisá-los) .

Você quer "livrar-se de" os erros Permission denied .

  1. Você pode adicionar 2>/dev/null ao final do seu comando assim:

    grep -rn --include="*.py" "search-pattern" 2>/dev/null
    

    Isso suprime todas as mensagens de erro, para que você não veja os erros Permission denied aparecendo. Mas, obviamente, isso ainda significa que o grep não está pesquisando esses arquivos, portanto, se eles contiverem seu padrão de pesquisa, você não os verá na saída.

      

    Explicação :
      No Linux, há três itens chamados descritores de arquivos : stdin , stdout stderr . Se você executar um comando e der um erro, o erro será gravado no descritor de arquivo stderr . Por padrão, stderr envia os erros para o terminal. Então, o que podemos fazer é redirecionar os erros, ou seja, redirecionamos stderr para outro lugar em vez do terminal. Nós redirecionamos as coisas no Linux usando o sinal > . Então, para onde vamos redirecionar stderr ? Codificar%. /dev/null é um arquivo especial; pense nisso como um buraco negro. Qualquer coisa que você redirecionar para ele é jogado fora. Por fim, nos referimos a /dev/null como simplesmente o número stderr . Então 2 diz ao Linux para redirecionar 2>/dev/null para 2 . /dev/null significa 1 (que é a saída normal de um comando, ou seja, não erros). Portanto, por exemplo, se você quiser salvar a saída real do seu comando grep em um arquivo em vez de exibi-lo no terminal, use stdout , que redirecionará 1>/path/to/filename para esse arquivo.

  2. Use stdout com seu comando, supondo que você tenha os privilégios:

    sudo grep -rn --include="*.py" "search-pattern"
    

    Se o seu nome de usuário tiver privilégios de root (ou seja, se você for um administrador na máquina), use sudo antes de um comando ser executado como usuário root, assim você nunca obterá sudo erros e grep pesquisará esses arquivos e exibirá o padrão de pesquisa se os encontrar dentro deles.

por Alaa Ali 06.11.2014 / 23:28
1

É um problema comum, você pode resolvê-lo diretamente na linha de comando.
Você pode usar --devices=skip para ignorar os arquivos especiais do dispositivo (fonte de erros e loops infinitos em muitos sistemas). Execute sudo chown -R new_owner_name file_pattern para alterar a propriedade do arquivo recursivamente e evitar os erros de permissão. Se você redirecionar o fluxo de erros com COMMAND 2> DESTINATION_OR_/dev/null , os erros ainda acontecerão e você não obterá os resultados desejados do grep.
Se possível, nunca use sudo automaticamente para fazer a análise ( pode ser um ponto fraco do sistema), tente alterar a propriedade do arquivo quando necessário. Uma versão gráfica do sudo está disponível se você precisar pedir permissão ao usuário.

Por favor, sinta-se à vontade para comentar aqui se você tiver mais perguntas inerentes e não se esqueça de pressionar a seta para CIMA da esquerda se eu for de alguma ajuda.
Tenha um bom dia.

    
por Lorenzo Ancora 06.11.2014 / 23:42