
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 -l
opçã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 print0
a opção para arquivo, posteriormente -0
para xargs
e, por último, -I {}
para segundo xargs
.
find . -iname "*.maxpat" -print0 | xargs -0 grep -l "mystring" | xargs -I '{}' open '{}'
Testado emacs
como um open
comando.
Responder2
-exec
pega 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 grep
você está usando, mas se estiver lendo a página de manual grep
corretamente, 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 vim
ou gvim
, você pode usar isto:
$ grep -n mystring *.ext > /tmp/mystring.list
$ vim -q /tmp/mystring.list
(Nunca tentei combinar esses dois comandos porque vim
não lê quickfix
/ errorfile
from stdin
)
O Vim abrirá o primeiro arquivo /tmp/mystring.list
e posicionará o cursor diretamente na linha onde mystring
foi encontrado. Você pode ir para a próxima instância usando :cn
e para a instância anterior usando :cp
.
Se você não é vim
usuário e disse que a pergunta vinculada não ajudou muito, então find ... -print0
deve ajudar - como já sugerido.
Responder4
Use pwd
por encontrar:
find `pwd` -iname *.maxpat | xargs grep -l "mystring" | xargs open