grep para arquivos e abra os resultados resultantes

2

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 opção -l para retornar apenas nomes de arquivos, mas gostaria de combinar isso de alguma forma com outra série de sinalizadores ou argumentos para obter os caminhos completos dos 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. Note que eu gostaria de recorrer a todos os subdiretórios também. Eu vi esta questão , que não se relaciona completamente.

ATUALIZAÇÃO:

Consegui esse tipo de trabalho com

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

O problema é que, para muitos dos 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 , em que o caminho tem um espaço.

    
por jml 04.10.2014 / 23:29

4 respostas

3

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

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

Testado com emacs como um comando open .

    
por 05.10.2014 / 00:40
1

-exec pega o status de saída do comando que você coloca nele e usa-o logicamente em find

Portanto, apenas algo simples como este deve funcionar

find . -iname "*.ext" -exec grep -q "mystring" {} \; -exec open {} \;
    
por 05.10.2014 / 09:05
1

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

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

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

(Eu nunca tentei combinar esses dois comandos, pois vim não leu quickfix / errorfile de stdin )

O Vim abrirá o primeiro arquivo em /tmp/mystring.list e posicionará o cursor diretamente na linha em que mystring foi encontrado. Você pode ir para a próxima instância usando :cn e a instância anterior usando :cp .

Se você não é um usuário vim e desde que você disse que a pergunta vinculada não ajudou muito, então find ... -print0 deve ajudar - como já sugerido.

    
por 05.10.2014 / 16:59
-1

Use pwd por find:

find 'pwd' -iname *.maxpat | xargs grep -l "mystring" | xargs open
    
por 04.10.2014 / 23:38