Buscar | grep no funciona en Cygwin

Buscar | grep no funciona en Cygwin

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 xargsy 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 fsolo 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 grepstdin, trata la lista como texto y buscafoo

No tiene ningún nombre de archivo, foopor 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

findbusca 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 grepusando el operador de tubería, grepse verá la cadena bar(el nombre de archivo) yno foo(el contenido del archivo bar).

greppor lo tanto, no encuentra una coincidencia y no tiene nada que generar.

Nota:

  • grepPuede buscar archivos directamente. No es necesario utilizar find. tuberías |, o xargscomo 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

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 .

información relacionada