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).

kiki
fonte

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 .

Manish Ranjan
fonte
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).

usta
fonte
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" .
Stefan Steiger
fonte
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.

Nico Huysamen
fonte
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.

mu é muito curto
fonte
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.

Paxwell
fonte
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
Nwaoga
fonte
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 {}").

jfhfhf839
fonte
4
grep -R "string" /directory/

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

DimiDak
fonte
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.

eLRuLL
fonte
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

Semelhante à resposta postada por @eLRuLL, uma maneira mais fácil de especificar uma pesquisa que respeite os limites das palavras é usar a -wopção:

grep -wnr "yourString" .
Mike Slinn
fonte
No prompt do cmd ou no terminal do Windows, o termo grep não é reconhecido
kouty 27/01
@kouty grep é um comando do Unix. itechtics.com/using-findstr-windows
Hugo M. Zuleta
1

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

grep -r 'your string goes here' * 
Iwantha
fonte
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.

yucer
fonte
-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.

AAAfarmclub
fonte
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