Por que piping find e grep não retorna nada?

Por que piping find e grep não retorna nada?

Estou tentando pesquisar grepdentro 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 greptenta 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 findcomando deveria ser:

find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'

Que encontra arquivos mydircom .javaextensão e contendoMinha classe. -Hinstrui grepa gerar o nome do arquivo na frente do resultado.

informação relacionada