Estou tentando pesquisar grep
dentro de arquivos especificados que são retornados por find
:
find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \; | grep 'MyClass'
Isso não funciona.
Enquanto isso, isso funciona.
grep 'MyClass' $(find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \;)
Qual é o problema com meu primeiro exemplo?
Responder1
No primeiro caso você grep a lista de nomes de arquivos retornados por find
, enquanto no segundo caso a lista de nomes de arquivos é um argumento para grep, então grep irá pesquisar dentro dos arquivos.
Pipe é uma entrada padrão, não um arquivo nomeado. É por isso que o grep se comporta de maneira diferente.
De man grep
:
grep pesquisa nos ARQUIVOS de entrada nomeados (ou na entrada padrão se nenhum arquivo for nomeado ou se um único hífen-menos (-) for fornecido como nome do arquivo) por linhas que contenham uma correspondência com o PATTERN fornecido.
Responder2
Porque no primeiro caso grep
tenta encontrar 'MyClass' nos nomes dos arquivos e no segundo tenta encontrar 'MyClass' no conteúdo dos arquivos.
O primeiro é igual a
find . -type d -name 'mydir*' -exec find '{}' -name '*MyClass*.java' \;
enquanto o segundo é igual a
find . -type d -name 'mydir*' -exec sh -c \
"find '{}' -name '*.java' -exec grep 'MyClass' {} \;" \;
Responder3
Acho que seu find
comando deveria ser:
find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'
Que encontra arquivos mydir
com .java
extensão e contendoMinha classe. -H
instrui grep
a gerar o nome do arquivo na frente do resultado.