Tengo cygwin instalado y cuando busco el código fuente con este comando no aparece nada, incluso que tengo esa cadena en un archivo
$ echo foo > bar
$ find . -name '*' | grep foo
No aparece nada. Este comando funciona bien en GNU+Linux.
$ grep foo bar
Respuesta1
Como se mencionó, find genera una lista de archivos encontrados en stdout, grep normalmente espera buscar a través de stdout si se llama de esta manera.
También podría canalizar find to xargs
y lo hará "construir y ejecutar líneas de comando desde la entrada estándar", como en
$ find . | xargs grep foo
Si tiene nombres de archivos locos, con nuevas líneas y todo eso, entonces esto sería mejor:
$ find . -type f -print0 | xargs -0 grep foo
y -type f
solo encontrará archivos normales, por lo que no intentará buscar en ninguno .
de ..
los directorios o archivos "divertidos".
Respuesta2
find . -name '*' # This will produce a list of *file names*
Luego pasa su lista de nombres de archivos a grep
stdin, trata la lista como texto y buscafoo
No tiene ningún nombre de archivo, foo
por lo que no devuelve nada.
Para buscar recursivamente a través de archivos buscando texto en un archivo, simplemente puede usar
grep -R foo somefolder/
Respuesta3
Cuando busco el código fuente con este comando no aparece nada
$ echo foo > bar
$ find . -name '*' | grep foo
find
busca nombres de archivos que cumplan con los criterios deseados: nombre, tamaño, tipo de archivo y devuelve una lista de nombres de archivos coincidentes. No devuelve elcontenidode los archivos coincidentes.
Cuando se pasa esa lista de nombres de archivos grep
usando el operador de tubería, grep
se verá la cadena bar
(el nombre de archivo) yno foo
(el contenido del archivo bar
).
grep
por lo tanto, no encuentra una coincidencia y no tiene nada que generar.
Nota:
grep
Puede buscar archivos directamente. No es necesario utilizarfind
. tuberías|
, oxargs
como se sugiere en otra respuesta.
El siguiente comando funciona en Cygwin:
grep --exclude-dir=* "foo" ./*
Ejemplo:
DavidPostill@Hal /f/test
$ cat bar
foo
DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo
Otras lecturas
- Un índice AZ de la línea de comando Bash para Linux- Una excelente referencia para todo lo relacionado con la línea de comandos de Bash.
- encontrar- Busque en una jerarquía de carpetas nombres de archivos que cumplan con los criterios deseados: nombre, tamaño, tipo de archivo.
- grep- Buscar archivos para texto específico.
Respuesta4
Creo que quieres esto.
find . -name '*' -type f -exec grep foo /dev/null {} \;
Solo desea buscar archivos, no directorios ni archivos especiales. /dev/null hace que grep muestre el nombre del archivo. Es posible que desees deshacerte de '-name '*', pero si lo haces, los archivos de puntos se guardarán.
También podrías correr
grep -r foo .