Encontrar | grep não funciona no Cygwin

Encontrar | grep não funciona no Cygwin

Tenho o cygwin instalado e quando procuro o código fonte com este comando nada aparece, mesmo que eu tenha essa string em um arquivo

$ echo foo > bar
$ find . -name '*' | grep foo

Nada aparece. Este comando funciona bem no GNU+Linux.

$ grep foo bar

Responder1

Como mencionado, find gera uma lista de arquivos encontrados para stdout, grep normalmente espera pesquisar através de stdout se for chamado desta forma.

Também poderia canalizar find para xargs, e "construir e executar linhas de comando a partir da entrada padrão", como em

$ find . | xargs grep foo

Se você tiver nomes de arquivos malucos, com novas linhas e outros enfeites, então seria melhor:

$ find . -type f -print0 | xargs -0 grep foo

e ele -type fencontrará apenas arquivos regulares, portanto, nenhuma tentativa de navegar por qualquer .diretório ..ou arquivo "engraçado".

Responder2

find . -name  '*' # This will produce a list of *file names*

Você então passa sua lista de nomes de arquivos para grepstdin, ele trata a lista como texto e procura porfoo

Você não tem nome de arquivo, fooentão ele não retorna nada.

Para pesquisar recursivamente em arquivos procurando texto em um arquivo, você pode simplesmente usar

grep -R foo somefolder/

Responder3

Quando procuro o código fonte com este comando nada aparece

$ echo foo > bar
$ find . -name '*' | grep foo

findprocura nomes de arquivos que atendam aos critérios desejados: Nome, Tamanho, Tipo de arquivo e retorna uma lista de nomes de arquivos correspondentes. Não retorna oconteúdodos arquivos correspondentes.

Quando essa lista de nomes de arquivos for passada para grepo operador pipe, grepvocê verá a string bar(o nome do arquivo) enão foo(o conteúdo do arquivo bar).

grepportanto, não encontra uma correspondência e não tem nada para gerar.

Observação:

  • greppode pesquisar arquivos diretamente. Você não precisa usar find. pipes |ou xargscomo sugerido em outra resposta.

O seguinte comando funciona no Cygwin:

grep --exclude-dir=* "foo" ./*

Exemplo:

DavidPostill@Hal /f/test
$ cat bar
foo

DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo

Leitura adicional

  • Um índice AZ da linha de comando Bash para Linux- Uma excelente referência para todas as coisas relacionadas à linha de comando do Bash.
  • encontrar- Pesquise em uma hierarquia de pastas nomes de arquivos que atendam aos critérios desejados: Nome, Tamanho, Tipo de arquivo.
  • grep- Pesquise arquivos por texto específico.

Responder4

Eu acho que você quer isso.

find . -name '*' -type f -exec grep foo /dev/null {} \;

Você deseja apenas fazer grep em arquivos, não em diretórios ou arquivos especiais. O /dev/null faz com que o grep mostre o nome do arquivo. Você pode querer se livrar de '-name '*', mas se o fizer, os arquivos de ponto serão grepados.

Você também pode correr

grep -r foo .

informação relacionada