Como posso usar o grep para encontrar uma palavra dentro de uma pasta?


542

No Windows, eu teria feito uma pesquisa para encontrar uma palavra dentro de uma pasta. Da mesma forma, quero saber se uma palavra específica ocorre dentro de um diretório que contém muitos subdiretórios e arquivos. Minhas pesquisas pela sintaxe grep mostram que devo especificar o nome do arquivo, ou seja grep string filename.

Agora, não sei o nome do arquivo, então o que devo fazer? Um amigo sugeriu que fizesse grep -nr string, mas não sei o que isso significa e não obtive resultados (não há resposta até eu emitir a ctrl + c).

Respostas:


849
grep -nr 'yourString*' .

O ponto no final pesquisa o diretório atual. Significado para cada parâmetro:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Encontraria MobileAppServlet.javaor MobileAppServlet.classou MobileAppServlet.txt; 'MobileAppASer*.*'é outra maneira de fazer a mesma coisa.)

Para verificar mais parâmetros, use o comando man grep .


14
Qual é o negócio *? Isso resultará na expansão do curinga do shell (se houver nomes de arquivos correspondentes ao padrão do curinga) ou o grep o considerará como operador de repetição de 0 ou mais para o caractere anterior *.
usta 27/03

7
Agora vamos considerar as duas possibilidades para grep -nr MobileAppSer* .1. Suponha que temos 3 arquivos no diretório atual correspondência MobileAppSer*padrão de curinga: chamada MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Em seguida, grepserá chamado desta forma: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Significa procurar o texto "MobileAppServlet.class" nos arquivos MobileAppServlet.java, MobileAppServlet.txt e em outras partes do diretório atual - o que certamente não é o que o usuário deseja aqui.
usta 27/03

7
2. Caso não haja arquivos no diretório atual que correspondam ao MobileAppSer*padrão curinga, grepreceberá o argumento MobileAppSer*como está e, portanto, o utilizará como pesquisa pelo texto "MobileAppSe" seguido por 0 ou mais ocorrências de "r", portanto, ele receberá tente encontrar textos "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr" etc. etc. no conteúdo dos arquivos do diretório atual - e também não no que o usuário deseja.
usta

5
Esta é uma escolha duvidosa de regex. Usta apontou isso.
kindasimple

117
grep -nr string my_directory

Notas adicionais: isso satisfaz a sintaxe, grep [options] string filenameporque em sistemas do tipo Unix, um diretório é um tipo de arquivo (existe um termo "arquivo regular" para se referir especificamente a entidades que são chamadas apenas de "arquivos" no Windows).

grep -nr string lê o conteúdo a ser pesquisado a partir da entrada padrão, é por isso que apenas aguarda a entrada de você e para de fazê-lo quando você pressiona ^ C (também seria interrompido em ^ D, que é a combinação de teclas para final de -Arquivo).


1
Ei, então se eu quiser procurar por uma string independentemente do caso, devo fazer isso: grep -i -nr "minha palavra".
Kiki

2
@kiki: Sim, o que equivale agrep -inr "my word" .
usta

16
@kiki: -rfor grep significa pesquisar nos subdiretórios recursivamente e -nsignifica prefixar cada linha de saída com o número da linha correspondente do arquivo que contém essa linha. man grepdescreve tudo isso e muito mais.
usta

62

GREP : Global Expression Regular Print / Parser / Processor / Program.
Você pode usar isso para pesquisar o diretório atual.
Você pode especificar -R como "recursivo", o que significa que o programa pesquisa em todas as subpastas, subpastas e subpastas, etc.

grep -R "your word" .

-nimprimirá o número da linha, onde ele correspondeu no arquivo.
-iprocurará sem distinção entre maiúsculas e minúsculas (maiúsculas / minúsculas).

grep -inR "your regex pattern" .

3
./* meios todos os arquivos no diretório atual, -R meios recursivo (pesquisar subdiretórios etc.)
Stefan Steiger

25
grep -nr search_string search_dir

fará uma pesquisa RECURSIVE (ou seja, o diretório e todos os seus subdiretórios) pela search_string. (conforme corretamente respondido por usta).

O motivo pelo qual você não recebeu nenhuma resposta com a sugestão de seu amigo de:

grep -nr string

é porque nenhum diretório foi especificado. Se você estiver no diretório em que deseja fazer a pesquisa, faça o seguinte:

grep -nr string .

É importante incluir o '.' caractere, pois isso indica ao grep para pesquisar neste diretório.


Olá, o que devo fazer se tiver de procurar 2 palavras com um espaço entre elas? As palavras devem ser especificadas entre aspas? ie grep -nr "minha palavra".
Kiki

24

Há também:

find directory_name -type f -print0 | xargs -0 grep -li word

mas isso pode ser um pouco demais para um iniciante.

findé um diretório de uso geral walker / lister, -type fsignifica "procure arquivos simples em vez de diretórios e pipes nomeados e o que você tem", -print0significa "imprima-os na saída padrão usando caracteres nulos como delimitadores". A saída de findé enviada para xargs -0e que agarra sua entrada padrão em chunks (para evitar limitações de comprimento de linha de comando) usando caracteres nulos como separador de registros (em vez da nova linha padrão) e se aplica grep -li worda cada conjunto de arquivos. No grep, -lsignifica "lista os arquivos que correspondem" e -isignifica "não faz distinção entre maiúsculas e minúsculas"; geralmente você pode combinar opções de caracteres únicos para ver com -limais frequência -l -i.

Se você não usar -print0e -0terá problemas com nomes de arquivos que contêm espaços, portanto, usá-los é um bom hábito.


1
@mmmshuddup: Obrigado. Eu me sinto mal se não der uma explicação como parte da resposta, especialmente quando estiver trabalhando com um iniciante.
mu é muito curto

1
É disso que eu mais aprecio neste site. É importante lembrar que éramos todos iniciantes uma vez e não é fácil aparecer no mundo da tecnologia!
Sim Barry

posso excluir determinados diretórios? @muistooshort
Ferologics

@Ferologics Deve haver, verifique man findna linha de comando para ver quais opções seu findsuporte.
mu é muito curto

8

Por que não fazer uma pesquisa recursiva para encontrar todas as instâncias nos subdiretórios:

grep -r 'text' *

Isso funciona como um encanto.


1
Não há necessidade de corda orçamento Pesquisa sem caracteres especiais, como espaços
Scott Stensland

5
  1. grep -r "yourstring" * Encontrará "yourstring" em todos os arquivos e pastas

Agora, se você deseja procurar duas cadeias diferentes ao mesmo tempo, sempre pode usar a opção E e adicionar palavras para a pesquisa. exemplo após o intervalo

  1. grep -rE "yourstring|yourotherstring|$" *procurará por locais da lista onde yourstringou yourotherstringcorresponde

4

Outra opção que eu gosto de usar:

find folder_name -type f -exec grep your_text  {} \;

-type f retorna apenas arquivos e não pastas

-exec e {} executa o grep nos arquivos encontrados na pesquisa (a sintaxe exata é "-exec command {}").


4
grep -R "string" /directory/

-R também segue links simbólicos quando -r não.


2

A resposta que você selecionou é boa e funciona, mas não é a maneira correta de fazê-lo, porque:

grep -nr yourString* .

Na verdade, isso pesquisa a string "yourStrin"e "g"0 ou várias vezes.

Portanto, a maneira correta de fazer isso é:

grep -nr \w*yourString\w* .

Este comando pesquisa a cadeia com qualquer caractere antes e depois na pasta atual.


2
no entanto grep -nr yourStringfunciona também, como ele procura o nu yourStringem qualquer lugar na linha (ou pelo menos ele faz no meu sistema, OSX Lion)
theheadofabroom


1

Execute (terminal) o seguinte comando dentro do diretório Ele também verificará recursivamente os subdiretórios.

grep -r 'your string goes here' * 

0

Os seguintes aparência de amostra de forma recursiva para your search stringno *.xmle *.jsarquivos em algum lugar localizado dentro das pastas path1, path2e path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Assim, você pode procurar em um subconjunto dos arquivos por muitos diretórios, fornecendo apenas os caminhos no final.


-4

Não use grep. Faça o download do Silver Searcher ou ripgrep . Ambos são excelentes e muito mais rápidos do que o grep ou o ack com inúmeras opções.


2
Essas talvez sejam ótimas ferramentas, mas isso não responde como eu usaria essas ferramentas para realizar o que o OP está pedindo.
jmathew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.