2013-07-02 09:24:45 +0000 2013-07-02 09:24:45 +0000
83
83

Encontrar ficheiros que contenham uma determinada cadeia usando o find (1) e o grep (1)

find . -type f -print -exec cat {} \; | grep some string

O comando acima não imprime o caminho do ficheiro.

Estou a utilizar: Ubuntu, bash 4.

Respostas (5)

117
117
117
2013-07-02 12:01:16 +0000

Uso

grep "some string" . -R

e funciona mais rápido

p.s.

Caso de uso mais complexo

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex

Para ler a explicação param i

grep --help | grep -- -i
98
98
98
2013-07-02 10:02:41 +0000

Isto porque está a alimentar grep um fluxo de texto que por acaso contém apenas nomes de ficheiros. Uma vez que não forneceu nomes de ficheiro como argumentos para o grep, não se pode esperar que deduza de que ficheiro veio uma linha correspondente. Use xargs:

find . -type f -print | xargs grep "some string"

Uma vez que tem GNU find/xargs, esta é uma forma mais segura para xargs ler nomes de ficheiros:

find . -type f -print0 | xargs -0 grep "some string"

Se quiser apenas os nomes de ficheiros que têm uma linha correspondente sem mostrar a linha correspondente:

find . -type f -print0 | xargs -0 grep -l "some string"
14
14
14
2014-09-26 13:24:22 +0000

Procuro frequentemente o código fonte em estruturas de pastas complexas e considero útil a sua utilização:

cd /your/folder/
grep -rHino "your string"

Com estes parâmetros, sem utilizar o find, obtenho o file caminho completo* e o número de linha* que contém a fila especificada*.

Também é fácil de lembrar porque BASHes através da sua pesquisa como um rHino* :)

Vou mostrar como isto funciona com um exemplo rápido.

Vamos mostrar o conteúdo de um ficheiro utilizando o gato:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

E vamos pesquisar recursivamente por todos os ficheiros que contenham a string “iptables -P”:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Como pode ver na saída temos filename:hit row:searched string

Aqui está uma descrição mais detalhada dos parâmetros utilizados:

-r Para cada operando de directório, leia e processe todos os ficheiros desse directório, recursivamente. Siga as ligações simbólicas na linha de comando, mas salte os links simbólicos que são encontrados recursivamente. Note que se não for dado um operando de ficheiro, o grep pesquisa o directório de trabalho. Isto é o mesmo que a opção ‘–directórios=encomenda’.

-i Imprimir o nome do ficheiro para cada correspondência. Este é o padrão quando há mais do que um ficheiro a pesquisar.

-n* Prefixa cada linha de saída com o número de linha baseado em 1 dentro do seu ficheiro de entrada. (-n é especificado pelo POSIX.)

-H* Imprimir o nome do ficheiro para cada correspondência. Este é o padrão quando há mais do que um ficheiro a pesquisar.

-o Imprimir apenas as partes correspondentes (não vazias) das linhas correspondentes, com cada uma dessas partes numa linha de saída separada. As linhas de saída utilizam os mesmos delimitadores como entrada, e os delimitadores são bytes nulos se -z (–null-data) for também utilizado (ver Outras Opções).

2
2
2
2015-10-28 19:03:56 +0000

Preferi

| find the file |make grep ont finding file | show de full path of the file

find / -type f -exec grep ‘some string’ {} {}; -exec echo {} {} {};

0
0
0
2018-10-22 16:15:38 +0000

Silver Searcher ](https://github.com/ggreer/the_silver_searcher) é uma utilização muito rápida e útil para pesquisar ficheiros e conteúdos.

Para resolver o seu problema, o comando Silver Searcher teria este aspecto…

ag 'some string' -l

-l Imprima apenas nomes de ficheiros que contenham correspondências (não imprima as linhas correspondentes)