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 f
encontrará 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 grep
stdin, ele trata a lista como texto e procura porfoo
Você não tem nome de arquivo, foo
entã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
find
procura 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 grep
o operador pipe, grep
você verá a string bar
(o nome do arquivo) enão foo
(o conteúdo do arquivo bar
).
grep
portanto, não encontra uma correspondência e não tem nada para gerar.
Observação:
grep
pode pesquisar arquivos diretamente. Você não precisa usarfind
. pipes|
ouxargs
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 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 .