Windows XP - Como usar o grep para encontrar strings em arquivos em subdiretórios

1

Uma vez eu tive uma versão do grep no meu PC (acho que veio com uma versão anterior do Delphi) que suportava a pesquisa em pastas aninhadas com a opção -r . Agora algo (eu suspeito que uma versão posterior do Delphi) sequestrou o antigo grep e o substituiu por algo que se anuncia assim:

C:\PROJECTS\>grep --version
grep (GNU grep) 2.4.2

Copyright 1988, 1992-1999, 2000 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

fornece estas opções para recursão:

-d, --directories=ACTION  how to handle directories
                          ACTION is 'read', 'recurse', or 'skip'.
-r, --recursive           equivalent to --directories=recurse.

mas não consigo retornar resultados de arquivos dentro de pastas, então grep -r fred *.txt encontrará apenas arquivos na pasta atual contendo "fred", e arquivos dentro de subpastas serão ignorados.

Qual é a opção mágica necessária aqui?

ANSWER de Rich Homolka está abaixo, mas aqui está meu wrapper de grupo desenvolvido a partir dessa resposta:

:==========================================================================
:   GrepExt - searches files matching an extension recursively for a string 
:
:   Usage   : call GrepExt <regex string to search for>  <extension>
:   Example : call GrepExt "procedure\ *Add" pas
:
:   Notes   : - quotes only needed if regex contains spaces
:             - remove the first "-i" for case-sensitive search 
:             - the second "-i" ensures the case of the extension doesn't matter     
:             - ErrorLevel set to 0 if there were any matches, 1 otherwise
:             - this is very inefficient when the folders contain a large
:               number of files that don't match the extension, as *all* files
:               are grepped and the results are then grepped to filter out
:               the hits from files that don't match the extension.         
:
@echo off
grep -i -r "%~1" . | grep -i "^[^:]*\.%~2:"
    
por rossmcm 15.07.2014 / 01:56

2 respostas

3

Grep provavelmente está funcionando corretamente. Seu comando é o que está desligado. Eu respondi algo semelhante antes aqui , sobre chown on UNIX, com um shell UNIX. Algumas das explicações podem ser úteis.

Se você quiser verificar usando o sinalizador recursivo, deseja passar um diretório:

grep -r fred .

Isto irá encontrar o fred em qualquer arquivo enraizado no., chamado * .txt ou não.

Se você quiser limitar isso apenas a arquivos com o nome * .txt, você pode fazer isso com o próprio grep:

grep -r fred . | grep '^[^:]*\.txt:'

Isso obviamente é um pouco desajeitado para digitar todas as vezes, mas funciona.

Uma maneira mais limpa é usar um shell estilo UNIX (ou pelo menos é muito difícil de fazer no prompt de comando, não sei como fazer isso).

No unix, para comandos recursivos, você geralmente usa o padrão

find file_selection_criteria | xargs command whatever_args

Neste caso, seria:

find . -name '*.txt' | xargs grep fred

Como uma coisa mais simples, se você baixou um shell bastante recente como o bash4 ou o zsh, você poderia usar o novo glob recursivo (double *):

shopt -s globstar # needed for bash4
grep fred ./**/*.txt

Então, isso realmente depende de quanto trabalho você gostaria de fazer. Se você quer apenas ter o grep funcionando agora, talvez você use o primeiro, e filtre qualquer coisa que não tenha o nome .txt. Se você fizer isso com frequência, talvez valha a pena investir na obtenção de um shell semelhante ao UNIX. Você pode obter um do Cygwin ou usar uma ou duas ferramentas de MinGW

    
por 15.07.2014 / 02:21
0

você pode usar o comando find nativo dentro de um loop for para o mesmo propósito:

for /r c:\users\administrator\desktop %a in (*) do @find /i /n "foo" %a

aqui começando pelo diretório c:\users\administrator\desktop , ele recursivamente ( /r ) procura pela string foo em todos os arquivos ( * ) em caso de sensibilidade ( /i ) ao lado de exibir seus números de linha ( /n ) se encontrado

    
por 09.10.2014 / 19:51