Como grep através de arquivos que correspondem a um regex

2

Eu desejo pesquisar a palavra-chave "test", em todos os arquivos que são do tipo "* .spec.in" no diretório atual recursivamente Isso não funciona:

grep -rn "test" ./*.spec.in

Como faço isso?

    
por Bruce 28.08.2013 / 23:17

1 resposta

2

Se você pensar sobre o que isso significa, isso não funcionará. O sinalizador -r significa que o grep esperará um diretório como fonte de arquivo, mas o seu glob corresponderá aos arquivos (ou nada). Isso é uma incompatibilidade.

Você pode fazer isso de várias maneiras.

A maneira "textbook", utilizável em qualquer UNIX (qualquer shell, na verdade) é separar a responsabilidade. Use find para fazer a recursão e, separadamente, grep. Vamos encontrar todos os arquivos correspondentes e entregá-los ao grep

find . -type f -name '*.spec.in' | xargs grep -n "test"

encontre, a partir daqui, arquivos com o nome correspondente '* .spec.in', passando o fluxo para xargs, o que transformará o fluxo em argumentos de linha de comando para o seu grep.

Se você não tem espaços em nomes de arquivos, tudo bem. Mas se você fizer isso, ou se você usar isso para fazer alterações no disco, você provavelmente quer isso um pouco mais apertado. Existem hacks onde você pode mexer com nomes de arquivos para danificar arquivos importantes no disco, então você deve ter muito cuidado com hacks de nomes de arquivos. Por segurança, ou espaços em nomes, você pode dizer ao find e xargs para se comunicar mais estreitamente. Veja -print0 , -0 abaixo.

find . -type f -name '*.spec.in' -print0 | xargs  -0 something_destructive_like_rm

Em shells mais novos, como zsh ou versões mais recentes do bash, você pode usar globs recursivos, que usam uma sintaxe especial **. Eles corresponderão recursivamente a um padrão de arquivo.

shopt -s globstar # needed for bash, not for zsh
grep "test" ./**/*.spec.in
    
por 28.08.2013 / 23:22

Tags