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

5

Estou tentando ter grep search em arquivos especificados 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 o meu primeiro exemplo?

    
por bahamat 12.07.2012 / 16:39

3 respostas

6

No primeiro caso você usa a lista de nomes de arquivos retornados por find , enquanto que no segundo caso a lista de nomes de arquivos é um argumento para grep, então o grep irá procurar dentro dos arquivos.

O tubo é uma entrada padrão, não um arquivo nomeado. É por isso que o grep se comporta de maneira diferente. De man grep :

grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given PATTERN.

    
por 12.07.2012 / 17:00
3

Porque no primeiro caso grep tenta encontrar 'MyClass' em nomes de arquivos e no segundo ele tenta encontrar 'MyClass' no conteúdo do arquivo.

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' {} \;" \;
    
por 12.07.2012 / 16:56
3

Acho que seu comando find deve ser:

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

Que localiza arquivos em mydir com .java extension e contendo MyClass . -H instrui grep a gerar o nome do arquivo na frente do resultado.

    
por 12.07.2012 / 23:54

Tags