Como usar o comando "grep" para encontrar texto, incluindo subdiretórios

Eu quero encontrar todos os arquivos que contêm uma string específica de texto. O grep o comando funciona, mas não sei como usá-lo para cada diretório (só posso fazer isso para meu diretório atual). Eu tentei ler man grep, mas não deu nenhuma ajuda.

Seria melhor usar

grep -rl "string" /path

onde

  • -r (ou --recursive) a opção é usada para atravessar também todos os subdiretórios de /path, enquanto
  • -l (ou --files-with-matches) a opção é usada apenas para imprimir nomes de arquivos de arquivos correspondentes, e não as linhas correspondentes (isso também pode melhorar a velocidade, dado que grep pare de ler um arquivo na primeira partida com esta opção).

Se você está procurando linhas correspondentes em arquivos, meu comando favorito é:

grep -Hrn 'search term' path/to/files
  • -H faz com que o nome do arquivo seja impresso (implícito quando vários arquivos são pesquisados)
  • -r faz uma pesquisa recursiva
  • -n faz com que o número da linha seja impresso

path/to/files pode ser . para pesquisar no diretório atual

Outras opções que considero muito úteis:

  • -I ignorar arquivos binários (complemento: -a tratar todos os arquivos como texto)
  • -F tratar search term como um literal, não uma expressão regular
  • -i faça uma pesquisa sem distinção entre maiúsculas e minúsculas
  • --color=always para forçar as cores mesmo quando tubulação através less. Fazer less cores de apoio, você precisa usar o -r Opcao:

    grep -Hrn search . | less -r
  • --exclude-dir=dir útil para excluir diretórios como .svn e .git.

Example output

Eu acredito que você pode usar algo assim:

find /path -type f -exec grep -l "string" {} \;

Explicação dos comentários

find é um comando que permite encontrar arquivos e outros objetos, como diretórios e links em subdiretórios de um determinado caminho. Se você não especificar uma máscara que os nomes de arquivos devem atender, ela enumera todos os objetos de diretório.

  • -type f especifica que ele deve processar apenas arquivos, não diretórios etc.
  • -exec grep especifica que para cada arquivo encontrado, ele deve executar o comando grep, passando seu nome de arquivo como um argumento para ele, substituindo {} com o nome do arquivo

Meu comando padrão é

grep -Rin string *

Eu uso um Capitólio ' R ' porque ls usa-o para recursivo. Como o grep aceita ambos, não há razão para não usá-lo.

Editar: por HVNSweeting, aparentemente -R seguirá links simbólicos onde como -r não vai.

Se você está disposto a tentar algo novo, Dê ack fotografo. O comando para pesquisar recursivamente o diretório atual para string e:

ack string

A instalação é bastante simples:

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(Desde que você já tenha o diretório ~/bin e é de preferência em seu PATH.)

O comando rgrep é dedicado para tal necessidade

Se não estiver disponível, você pode obtê-lo assim

mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep

Você pode definir diretamente em suas opções grep padrão, conforme descrito acima.

Eu uso pessoalmente

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"

topico : como sempre usar rgrep com cor

Atualização 2:

Esta linha de comandos usando find e grep corrige o problema:

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> para saída colorida:

$ find path_to_search_in -type f \            -exec grep --color=always -in searchString {} 2>/dev/null +

Exemplo:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

Um exemplo é executado no instantâneo abaixo:


Atualização 1:

Você pode tentar seguir o código; como uma função em seu .bashrc ou .bash_aliases ou em um script:

wherein () {     for i in $(find "$1" -type f 2> /dev/null);    do        if grep --color=auto -i "$2" "$i" 2> /dev/null; then            echo -e "\033[0;32mFound in: $i \033[0m\n";        fi;    done}

Uso: wherein /path/to/search/in/ searchkeyword

exemplo:

$ wherein ~/Documents/ "hello world"

(Nota: como sugerido nos comentários abaixo por @enzotib, isso não funciona com arquivos/diretórios, incluindo espaços em seus nomes.)


Original post

Para procurar a string e produzir apenas essa linha com a string de pesquisa:

$ for i in $(find /path/of/target/directory -type f); do \    grep -i "the string to look for" "$i"; done

como.:

$ for i in $(find /usr/share/applications -type f); \    do grep -i "web browser" "$i"; done

Para exibir o nome do arquivo contendo a string de pesquisa:

$ for i in $(find /path/of/target/directory -type f); do \    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

como.:

$ for i in $(find /usr/share/applications -type f); \    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \    fi; done;

grep (GNU ou BSD)

Você pode usar grep ferramenta para pesquisar recursivamente a pasta atual com -r parâmetro, como:

grep -r "pattern" .

Notar: -r - Procurar recursivamente subdiretórios.

Para pesquisar em arquivos específicos, você pode usar um sintaxe globbing como:

grep "class foo" **/*.c

Nota: usando opção de globbing (**), ele verifica todos os arquivos recursivamente com extensão ou padrão específico. Para habilitar essa sintaxe, execute: shopt -s globstar. Você também pode usar **/*.* para todos os arquivos (excluindo ocultos e sem extensão) ou qualquer outro padrão.

Se você tiver o erro de que seu argumento é muito longo, considere restringir sua pesquisa ou usar find sintaxe em vez disso, como:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

Como alternativa, use ripgrep.

ripgrep

Se você está trabalhando em projetos maiores ou arquivos grandes, você deve usar ripgrep em vez disso, como:

rg "pattern" .

Verifique os documentos, etapas de instalação ou código-fonte no Página do projeto GitHub.

É muito mais rápido do que qualquer outra ferramenta como GNU/BSD grep, ucg, ag, sift, ack, pt ou similar, uma vez que é construído em cima de Motor regex da Rust que usa autômatos finitos, SIMD e otimizações literais agressivas para tornar a pesquisa muito rápida.

Ele suporta ignorar padrões especificados em .gitignore arquivos, portanto, um único caminho de arquivo pode ser combinado com vários padrões glob simultaneamente.


Você pode usar os parâmetros comuns, como:

  • -i - Busca insensível.
  • -I - Ignore os arquivos binários.
  • -w - Procure as palavras inteiras (em frente à correspondência parcial de palavras).
  • -n - Mostre a linha do seu par.
  • -C/--context (como. -C5)- Aumenta o contexto, então você vê o código circundante .
  • --color=auto - Marque o texto correspondente.
  • -H - Exibe o nome do arquivo onde o texto é encontrado.
  • -c - Exibe a contagem de linhas correspondentes. Pode ser combinado com -H.

Eu faço isso usando xargs, um comando muito subestimado

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

encontrar ./ fornece uma lista recursiva de todos os arquivos em uma pasta atualentão você canaliza para xargs que executa o comando grep em cada um desses arquivos

Eu sei que há muitas respostas aqui, mas aqui está uma alternativa se você quiser adicionar outras restrições ao pesquisar os arquivos:

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

Isso funciona porque grep retornará 0 se encontrar um resultado, 1 caso contrário. Por exemplo, você pode encontrar arquivos 1 MB grande e contendo algo:

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

Para vários requisitos, você provavelmente deseja usar o sinalizador otimizador -O isso existe no GNU grep.

Curinga com ’ – include="*.C "’ opção, @ user311346, graças a @ Lekensteyn.

grep-Rin < yor pattern> * irá pesquisar a partir de diretórios atuais para baixo em todos os arquivos de texto.
Não tenho certeza de como fazer minha pesquisa recursivamente em padrões de arquivo como *.C com apenas grep

Use a combinação find e grep para pesquisar recursivamente arquivos por uma string nos diretórios current e all sub. Verifique isto http://wilddiary.com/find-files-containing-my-text/