Como usar o grep para procurar TODAS as pastas por texto?

0

Estou com problemas em pesquisar todos os diretórios de uma só vez com grep . Quando eu uso o comando:

find . -name "*.txt" | xargs grep texthere

Isso leva apenas uma eternidade e depois me dá erros de "nenhum arquivo ou diretório".

Por que isso está acontecendo e não há nada mais fácil do que grep ? Ou estou usando o comando errado?

    
por Chris 23.06.2016 / 05:19

3 respostas

1

Se você tem o grep, o próprio grep suporta a opção "-r" para pesquisar recursivamente, como sugerido por @Ouroborus.

Se infelizmente o seu grep não suporta tal opção, como no SunOS, você pode usar os seguintes comandos:

find . -name "*.txt" -exec grep -n your_pattern {} /dev/null \;

O complicado é /dev/null adicionado para garantir que cada execução do grep tenha dois arquivos (o arquivo correspondente * .txt e / dev / null) fornecidos, forçando-o a imprimir o nome dos arquivos que estão sendo pesquisados. E você pode adicionar a opção -type f de find para refinar o escopo de find .

    
por 23.06.2016 / 08:28
0

Como em esta resposta , você provavelmente está melhor:

grep -rnw '/path/to/somewhere/' -e "pattern"

  • -r or -R is recursive,
  • -n is line number, and
  • -w stands match the whole word.
  • -l (lower-case L) can be added to just give the file name of matching files.
    
por 23.06.2016 / 05:29
0

Se você está recebendo erros sobre as permissões (você não diz que sim), então eu acho que você está no diretório raiz ( / ) ou em algum caminho onde você não tem permissão para ler todos os arquivos, como /etc ou /var . Mas desde que você diz que leva muito tempo, estou inclinado mais para a primeira suposição (o diretório raiz).

Se você quiser pesquisar absolutamente todos arquivos no sistema todo , o que você está fazendo está correto. vai demorar muito tempo, não importa o que você faça. É apenas um monte de arquivos para pesquisar.

Você pode usar find para diminuir a quantidade de arquivos a serem examinados.

No momento, você tem

$ find . -name "*.txt" | xargs grep texthere

Como parece que você está interessado apenas em arquivos de texto simples, podemos excluir qualquer outro tipo de arquivo (executáveis):

$ find / -type f \! -perm -o=x -name "*.txt" | xargs grep texthere

Substitui . por / aqui, porque é aí que penso que você está (corrija-me se estiver errado). Eu também estou especificando que eu quero arquivos ( -type f ) que são não executáveis ( \! -perm -o=x ) (o ! precisa ser escapado para que seu shell não faz coisas engraçadas com isso).

Agora, há mais algumas coisas que podemos fazer. Uma é uma questão de segurança, e a outra pode melhorar a velocidade um pouquinho.

Alguns nomes de arquivos podem ter espaços ou outros caracteres que normalmente não queremos em nomes de arquivos. Para poder transmiti-los corretamente entre find e grep , fazemos

$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 grep texthere

Isso ( -print0 ) significa que cada nome de arquivo será delimitado por um caractere nul ( xargs ) em vez de um caractere de espaço. E a opção correspondente a nul para receber esses nomes como -0 -delimited é fgrep .

É porque você não está usando as duas opções que acredito ter recebido os erros "não há arquivo ou diretório".

A velocidade é grep -F . Este é um utilitário que é exatamente equivalente a find que você deve usar se sua string de pesquisa for uma string de texto simples sem expressões regulares.

Portanto, se você tiver uma string de texto simples e quiser procurá-la em todos os arquivos do sistema:

$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 fgrep texthere

A coisa da permissão ... Obviamente, haverá arquivos que você não poderá ler. Você pode executar fgrep e sudo com -perm pré-anexados a eles:

$ sudo find ... | xargs -0 sudo fgrep texthere

Ou você poderia tentar criar outro find flag para sudo -s (e também ignorar diretórios que você não pode inserir), mas isso consumiria muito tempo e resultaria em uma linha de comando ridiculamente longa, então eu não farei isso aqui.

Ou você poderia apenas root obter um shell de root e executar a coisa de lá ... mas eu geralmente aconselharia contra isso porque as pessoas têm uma tendência a bagunçar seus sistemas esquecendo que são locate .

OUTRA SOLUÇÃO seria usar o comando .txt para localizar todos os arquivos locate em todo o sistema. O comando find não pesquisa a hierarquia de arquivos, mas usa um banco de dados (que geralmente é atualizado diariamente, portanto, nem todos os arquivos podem estar lá). O banco de dados contém apenas arquivos em diretórios acessíveis por todos os usuários, portanto, se você removeu as permissões de leitura em seus próprios diretórios, seus arquivos não estarão lá.

Então, substituindo o comando locate acima pelo -0 quase-equivalente:

$ locate '*.txt' -0 | xargs -0 fgrep texthere

A opção --null (ou --print0 em alguns sistemas) corresponde à opção find de %code% .

    
por 24.06.2016 / 22:28

Tags