Localizar | grep não funciona no Cygwin

4

Eu tenho cygwin instalado e quando eu 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
    
por jcubic 09.12.2015 / 10:46

4 respostas

3

Como mencionado, encontre saídas uma lista de arquivos encontrados para stdout, normalmente o grep espera pesquisar por stdout se chamado desta maneira.

Também pode encontrar pipe 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 outras coisas, isso seria melhor:

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

e o -type f só encontrará arquivos regulares, portanto, não há tentativas de passar por . ou .. ou quaisquer diretórios ou arquivos "engraçados".

    
por 09.12.2015 / 12:40
9
find . -name  '*' # This will produce a list of *file names*

Você passa sua lista de nomes de arquivos para grep no stdin, trata a lista como texto e procura por foo

Você não tem nome de arquivo foo , então não retorna nada.

Para pesquisar recursivamente por arquivos que procuram texto em um arquivo, você pode simplesmente usar

grep -R foo somefolder/
    
por 09.12.2015 / 11:03
2

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

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

find procura por nomes de arquivos que atendem a um critério desejado: Nome, Tamanho, Tipo de Arquivo e retorna uma lista de nomes de arquivos correspondentes. Não retorna o conteúdo dos arquivos correspondentes.

Quando essa lista de nomes de arquivos for passada para grep usando o operador de canal grep verá a string bar (o nome do arquivo) e não foo (o conteúdo do arquivo bar ).

Por conseguinte,

grep não encontra uma correspondência, pelo que não tem nada a produzir.

Nota:

  • grep pode pesquisar arquivos diretamente. Você não precisa usar find . pipes | , ou xargs como 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 A-Z da linha de comando do Bash para Linux - Uma excelente referência para todas as coisas relacionadas à linha de comando do Bash.
  • find - Pesquise uma hierarquia de pastas para o (s) nome (s) do (s) arquivo (s) que satisfazem os critérios desejados: Nome, tamanho, tipo de arquivo.
  • grep - Pesquisar arquivo (s) para texto específico.
por 09.12.2015 / 11:17
0

Eu acho que você quer isso.

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

Você só deseja arquivos grep, não diretórios ou arquivos especiais. O / dev / null faz o grep mostrar o nome do arquivo. Você pode querer se livrar de '-name' * ', mas se você fizer isso, então os arquivos de ponto serão grepped.

Você também pode executar

grep -r foo .
    
por 09.12.2015 / 16:14