¿Por qué la tubería find y grep no devuelve nada?

¿Por qué la tubería find y grep no devuelve nada?

Estoy intentando realizar grepuna búsqueda dentro de los archivos especificados que devuelve find:

find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \; | grep 'MyClass'

Esto no funciona.

Mientras tanto, esto funciona.

grep 'MyClass' $(find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \;)

¿Cuál es el problema con mi primer ejemplo?

Respuesta1

En el primer caso, grep la lista de nombres de archivos devueltos por find, mientras que en el segundo caso la lista de nombres de archivos es un argumento para grep, por lo que grep buscará dentro de los archivos.

Pipe es una entrada estándar, no un archivo con nombre. Por eso grep se comporta de manera diferente.
De man grep:

grep busca en los ARCHIVOS de entrada con nombre (o la entrada estándar si no se nombra ningún archivo, o si se proporciona un solo guión menos (-) como nombre de archivo) para líneas que contengan una coincidencia con el PATRÓN dado.

Respuesta2

Porque en el primer caso grepintenta encontrar 'MiClase' en los nombres de archivos y en el segundo intenta encontrar 'MiClase' en el contenido del archivo.

El primero es igual a

find . -type d -name 'mydir*' -exec find '{}' -name '*MyClass*.java' \;

mientras que el segundo es igual a

find . -type d -name 'mydir*' -exec sh -c \
"find '{}' -name '*.java' -exec grep 'MyClass' {} \;" \;

Respuesta3

Creo que tu findcomando debería ser:

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

Que encuentra archivos mydircon .javaextensión y que contienenMi clase. -Hindica grepque se muestre el nombre del archivo delante del resultado.

información relacionada