como executar a operação grep em todos os arquivos em um diretório


218

Trabalhando com o xenserver, e quero executar um comando em cada arquivo que está em um diretório, recebendo algumas coisas da saída do comando e anexando-o a um arquivo.

Eu sou claro sobre o comando que quero usar e como exibir as strings, conforme necessário.

Mas o que não estou claro é como faço para executar este comando em cada arquivo, indo para o próximo, até que não sejam encontrados mais arquivos.

Respostas:


228

grep $PATTERN *seria suficiente. Por padrão, o grep ignoraria todos os subdiretórios. No entanto, se você deseja cumprimentá-los, grep -r $PATTERN *é o caso.


37
"grep -r $ PATTERN." é suficiente. Para grep recursivo você não precisa especificar todos os arquivos
Cougar

1
Como faço para incluir várias extensões? Por exemplo. "* .cpp", "* .h"?
Tomáš Zato - Restabelece Monica

1
@ Tomáš Zato, apenas fornecer todos os seus padrões de arquivos em vez de *: grep $PATTERN *.cpp *.h. Se você precisar de regras mais específicas para quais arquivos devem ser recebidos, use o findcomando (verifique a resposta de Rob).
umi

@umi Se eu executar grep -r x .resultados, venho de todos os arquivos de todas as extensões. Se eu correr, grep -r x *.scssnão recebo resultados.
Chris

1
@ Chris, é possível que você não tenha *.scssarquivos no diretório atual, mas em algum lugar mais profundo nos subdiretórios, para que o grep não procure em todos os arquivos que você queria. Você deve usar a --includeopção para dizer ao grep para procurar recursivamente arquivos que correspondam a padrões específicos: grep -r x --include '*.scss' . (observe as aspas, elas impedem que o padrão seja expandido pelo shell). Ou apenas use find(veja a resposta de Rob).
umi

168

No Linux, eu normalmente uso esse comando para grep recursivamente um determinado texto em um diretório

grep -rni "string" *

Onde,

r = recursivo, ou seja, subdiretórios de pesquisa no diretório atual
n = para imprimir os números de linha em stdout
i = pesquisa sem distinção entre maiúsculas e minúsculas


32

Use encontrar. Sério, é o melhor caminho, porque então você pode realmente ver em quais arquivos ele está operando:

find . -name "*.sql" -exec grep -H "slow" {} \;

Observe que -H é específico do Mac, mostra o nome do arquivo nos resultados.


7
Se você decidir usar find, canalize a saída em xargsvez de usá- -execla será muito mais rápida, porque -execgera um novo processo para cada grep e a sobrecarga se torna significativa com um grande número de arquivos. Aplicam-se avisos padrão sobre espaços nos nomes de arquivos xargs.
Barton Chittenden

2
Como isso seria exatamente? Eu sempre esqueço a xargssintaxe.
Brian Peterson

3
@BrianPeterson seria algo parecido com isto:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince 18/08/16

4

Para pesquisar em todos os subdiretórios, mas apenas em tipos de arquivos específicos , use grep com --include.

Por exemplo, pesquisando recursivamente no diretório atual, o texto em * .yml e * .yaml:

grep "text to search" -r . --include=*.{yml,yaml}

1

Se você deseja executar vários comandos, você pode usar:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
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.