Localizando arquivos que contêm uma certa string usando find (1) e grep (1)

54

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

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

Estou usando: Ubuntu, bash 4 .

    
por H.Rabiee 02.07.2013 / 11:24

5 respostas

70

Isso porque você está alimentando grep de um fluxo de texto que, por acaso, contém nomes de arquivos. Como você não forneceu nomes de arquivos como argumentos para o grep, não se pode esperar que deduza de qual arquivo uma linha correspondente veio. Use xargs :

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

Como você tem o GNU find / xargs, esta é uma maneira mais segura de os xargs lerem nomes de arquivos:

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

Se você deseja apenas os nomes de arquivos que têm uma linha correspondente sem mostrar a linha correspondente:

find . -type f -print0 | xargs -0 grep -l "some string"
    
por 02.07.2013 / 12:02
88

eu uso

grep "some string" . -R

e está funcionando 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 do parâmetro i

grep --help | grep -- -i
    
por 02.07.2013 / 14:01
9

Eu sempre pesquiso código-fonte em estruturas de pastas complexas e acho útil usar:

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

Com esses parâmetros, sem usar o find , obtenho o caminho completo do arquivo e o número da linha que contém as cadeias especificadas .

Também é fácil lembrar, porque é BASH através de sua pesquisa como um rHino :)

Mostrarei como isso funciona com um exemplo rápido.

Vamos exibir o conteúdo de um arquivo usando cat:

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 procurar recursivamente para todos os arquivos 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 você pode ver na saída, temos filename: hit row: string pesquisada

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

-r For each directory operand, read and process all files in that directory, recursively. Follow symbolic links on the command line, but skip symlinks that are encountered recursively. Note that if no file operand is given, grep searches the working directory. This is the same as the ‘--directories=recurse’ option.

-i Print the file name for each match. This is the default when there is more than one file to search.

-n Prefix each line of output with the 1-based line number within its input file. (-n is specified by POSIX.)

-H Print the file name for each match. This is the default when there is more than one file to search.

-o Print only the matched (non-empty) parts of matching lines, with each such part on a separate output line. Output lines use the same delimiters as input, and delimiters are null bytes if -z (--null-data) is also used (see Other Options).

    
por 26.09.2014 / 15:24
1

Eu preferi

| encontre o arquivo | faça o grep ont encontrar arquivo | mostra o caminho completo do arquivo

encontre / -type f -exec grep 'alguma string' {} \; -exec echo {} \;

    
por 28.10.2015 / 20:03
0

O Silver Searcher é um utilitário muito rápido e útil para procurar arquivos e conteúdo.

Para resolver o seu problema, o comando do Silver Searcher ficaria assim ...

ag 'some string' -l

-l Apenas imprime nomes de arquivos que contenham correspondências (não imprima as linhas correspondentes)

    
por 22.10.2018 / 18:15

Tags