Pesquisando em muitos arquivos

6

Existe alguma técnica sofisticada para pesquisar strings em muitos arquivos?

Eu tentei esta técnica básica

for i in 'find .'; do grep searched_string "$i"; done;

Não parece muito sofisticado e, além disso, não encontrou nada na hierarquia de arquivos.

    
por xralf 05.12.2011 / 12:30

6 respostas

10

Você pode fazer qualquer um dos

grep pattern_search . # faz um grep normal no diretório atual

grep pattern_search * # usa um grep normal em todos os arquivos globbed do diretório atual

grep -R pattern_search . # usa uma pesquisa recursiva no diretório atual

grep -H pattern_search * # imprime o nome do arquivo quando os arquivos são mais de um. ‘-H’

Outras opções, como (do manual do gnu):

--directories=action
    If an input file is a directory, use action to process it. By default, 
    action is ‘read’, which means that directories are read just as if they 
    were ordinary files (some operating systems and file systems disallow 
    this, and will cause grep to print error messages for every directory 
    or silently skip them). If action is ‘skip’, directories are silently 
    skipped. If action is ‘recurse’, grep reads all files under each 
    directory, recursively; this is equivalent to the ‘-r’ option. 
--exclude=glob
    Skip files whose base name matches glob (using wildcard matching). A 
    file-name glob can use ‘*’, ‘?’, and ‘[’...‘]’ as wildcards, and \ to 
    quote a wildcard or backslash character literally. 
--exclude-from=file
    Skip files whose base name matches any of the file-name globs read from 
    file (using wildcard matching as described under ‘--exclude’). 
--exclude-dir=dir
    Exclude directories matching the pattern dir from recursive directory 
    searches. 
-I
    Process a binary file as if it did not contain matching data; this is 
    equivalent to the ‘--binary-files=without-match’ option. 
--include=glob
    Search only files whose base name matches glob (using wildcard matching 
    as described under ‘--exclude’). 
-r
-R
--recursive
    For each directory mentioned on the command line, read and process all 
    files in that directory, recursively. This is the same as the 
    --directories=recurse option.
--with-filename
    Print the file name for each match. This is the default when there is 
    more than one file to search. 
    
por 05.12.2011 / 13:03
6

Eu uso:

find . -name 'whatever*' -exec grep -H searched_string {} \;
    
por 05.12.2011 / 12:42
2

Com base na resposta do Chris Card, eu mesmo uso: find . -print0 | xargs -r0 grep -H searched_string O -print0 combinado com -0 no xargs garante que os espaços em branco em nomes de arquivos sejam manipulados corretamente. O -r diz ao xargs para dar pelo menos um nome de arquivo na linha de comando. Eu também geralmente uso fgrep se eu quiser cadeias fixas (sem expressão regular), o que é um pouco mais rápido.

Usar find . -print0 | xargs -0 cmd é mais rápido que find . -exec cmd {} \; . É um pouco mais lento que find . -exec cmd {} + , mas mais amplamente disponível do que o uso -exec +.

    
por 05.12.2011 / 13:09
2

Confira ack-grep . É perfeito para pesquisas rápidas e recebe pontos de bônus por ignorar .svn -directories por padrão. Ele exibe o nome do arquivo e o número da linha onde a string foi encontrada.

ack-grep -a Fnord
    
por 14.12.2011 / 12:45
1

Se você adicionar um / dev / null em seu comando, você também obterá o nome do arquivo onde a string é correspondida:

for i in 'find .'; do grep searched_string "$i" /dev/null ; done;
    
por 05.12.2011 / 12:40
1

Um padrão não mencionado ainda é:

find . -name "<filename>" | xargs grep "<>"

Como em

find . -name Makefile | xargs grep -v "target"

para encontrar em todos os seus Makefiles que não tenham um alvo em particular.

    
por 05.12.2011 / 17:50