Estoy intentando realizar grep
una 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 grep
intenta 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 find
comando debería ser:
find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'
Que encuentra archivos mydir
con .java
extensión y que contienenMi clase. -H
indica grep
que se muestre el nombre del archivo delante del resultado.