grep para arquivos e abra as correspondências resultantes

grep para arquivos e abra as correspondências resultantes

Estou tentando abrir todos os arquivos com base em alguns valores de retorno do grep na linha de comando. Eu sei que posso usar a -lopção de retornar apenas nomes de arquivos, mas gostaria de combinar isso de alguma forma com outra série de sinalizadores ou argumentos para gerar os caminhos completos desses arquivos.

Eu tentei algo como:

find . -iname "*.ext" | xargs grep -l "mystring" | xargs open

E também algo como:

grep -HR -l mystring . | xargs open

Com pouco sucesso. Observe que eu gostaria de recorrer a todos os subdiretórios também. Eu viessa questão, o que não se relaciona completamente.

ATUALIZAR:

Consegui fazer esse tipo de trabalho com

grep -HR -l mystring . | xargs -L 1 open

O problema é que, para muitos arquivos, a linha de comando reclama de duas maneiras:

LSOpenURLsWithRole() failed with error -1712 for the file /Users/blah/blah.ext

The files /blah/blah/file.ext do not exist, onde o caminho contém um espaço.

Responder1

Se você tiver espaços nos nomes dos arquivos, precisará usar print0a opção para arquivo, posteriormente -0para xargse, por último, -I {}para segundo xargs.

find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'

Testado emacscomo um opencomando.

Responder2

-execpega o status de saída do comando que você colocou nele e o usa logicamente dentrofind

Então, apenas algo simples como isto deve funcionar

find . -iname "*.ext" -exec grep -q "mystring" {} \; -exec open {} \;

Responder3

Não tenho certeza de qual versão grepvocê está usando, mas se estiver lendo a página de manual grepcorretamente, a verificação será interrompida após a primeira correspondência bem-sucedida. É isso que você quer? O que entendi da sua pergunta foi que você queria "abrir todos os arquivos".

Se você não se importa em usar vimou gvim, você pode usar isto:

$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list

(Nunca tentei combinar esses dois comandos porque vimnão lê quickfix/ errorfilefrom stdin)

O Vim abrirá o primeiro arquivo /tmp/mystring.liste posicionará o cursor diretamente na linha onde mystringfoi encontrado. Você pode ir para a próxima instância usando :cne para a instância anterior usando :cp.

Se você não é vimusuário e disse que a pergunta vinculada não ajudou muito, então find ... -print0deve ajudar - como já sugerido.

Responder4

Use pwdpor encontrar:

find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open

informação relacionada