Encontre arquivos que contenham um determinado texto
153
No bash, quero retornar o nome do arquivo (e o caminho para o arquivo) para cada arquivo do tipo que .php|.html|.jscontém a sequência que não diferencia maiúsculas de minúsculas"document.cookie" | "setcookie"
que não pareceu funcionar para mim (pelo menos não no mac) .... simplesmente trava ... egrep -lir --include = * "repo" egrep: aviso: pesquisa recursiva de stdin
Dean Hiller
13
Você esqueceu de adicionar o caminho a pesquisar. O caminho é '.' no exemplo acima. No seu caso, o script está aguardando a entrada pesquisar no stdin. Tente: egrep -lir --include = * "repo" / (ou qualquer outro caminho)
LodeRunner
1
grep -E ... >egrep ...
Aman
Erro grep: (error|fail): No such file or directoryno Ubuntu Desktop 16; alguma dica?
Nam G VU
Para fazer isso funcionar, tive que pular o * com \. então eu tenho--include=\*.{php,html,js}
Ou talvez usar a -lopção (apenas imprimir nomes de arquivos que jogo) em vez de-n
glenn jackman
15
findeles e greppara a string:
Ele encontrará todos os arquivos dos seus três tipos em / initial / path e grep para a expressão regular '(document\.cookie|setcookie)'. Divida mais de 2 linhas com a barra invertida apenas para facilitar a leitura ...
Como o uso universal da descoberta, mas a minha mente melhor usar-exec grep -l 'sth' {} \;
NGix
Obrigado @ Michael Berkowski Desta maneira, mais rápido mais de 5 ou 8 vezes # egrep -ir --include=file.foo "(foo|bar)" /dirno diretório de ~ 500Gb de peso.
Qh0stM4N
9
Parece um trabalho perfeito para grepou talvez ack
O uso de +1 -exec grep...é melhor que o meu xargsmétodo, pois não engasga com espaços nos nomes de arquivos.
Michael Berkowski 27/05
@MichaelBerkowski: Você pode usá-lo como este para lidar com espaços em branco em nomes de arquivos: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. Obviamente, as outras opções também podem ser adicionadas.
-regextype posix-extendeddiz findque tipo de regex esperar
-regex "^.*\.(php|html|js)$"informa findao próprio regex que os nomes de arquivos devem corresponder
-exec grep -EH '(document\.cookie|setcookie)' {} \;diz findpara executar o comando (com suas opções e argumentos) especificado entre a -execopção e o \;de cada arquivo encontrado, onde {}representa onde o caminho do arquivo está nesse comando.
enquanto
Eopção diz greppara usar regex estendido (para apoiar os parênteses) e ...
Hopção diz greppara imprimir caminhos de arquivo antes das correspondências.
E, dado isso, se você quiser apenas caminhos de arquivo, poderá usar:
|[pipe] envia a saída de findpara o próximo comando depois disso (que é sed, então sort)
ropção diz sedpara usar regex estendido.
s/HI/BYE/diz sedpara substituir toda Primeira ocorrência (por linha) de "HI" por "BYE" e ...
s/(^.*):.*$/\1/diz para substituir o regex (^.*):.*$(ou seja, um grupo [incluído entre ()] incluindo tudo [ .*= um ou mais caracteres] desde o início da linha [ ^] até 'o primeiro': 'seguido de qualquer coisa até' o final de linha [ $]) pelo primeiro grupo [ \1] do regex substituído.
udiz a classificação para remover entradas duplicadas (use sort -ucomo opcional).
... Longe de ser a maneira mais elegante. Como eu disse, minha intenção é aumentar o leque de possibilidades (e também dar explicações mais completas sobre algumas ferramentas que você pode usar).
Respostas:
O
r
sinalizador significa pesquisar recursivamente (pesquisar subdiretórios). Ai
bandeira significa que não diferencia maiúsculas de minúsculas.Se você deseja apenas nomes de arquivos, adicione o sinalizador
l
(minúsculoL
):fonte
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
no Ubuntu Desktop 16; alguma dica?--include=\*.{php,html,js}
Tente algo como
grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
o
-i
torna caso insensívelo
.
com os meios finais você deseja começar a partir de seu diretório atual, isso poderia ser substituído por qualquer diretório.os
-r
meios fazem isso recursivamente, na árvore de diretórioso
-n
imprime o número da linha para correspondências.o
--include
permite adicionar nomes de arquivos, extensões. Curingas aceitosPara mais informações, consulte: http://www.gnu.org/software/grep/
fonte
-l
opção (apenas imprimir nomes de arquivos que jogo) em vez de-n
find
eles egrep
para a string:Ele encontrará todos os arquivos dos seus três tipos em / initial / path e grep para a expressão regular
'(document\.cookie|setcookie)'
. Divida mais de 2 linhas com a barra invertida apenas para facilitar a leitura ...fonte
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
no diretório de ~ 500Gb de peso.Parece um trabalho perfeito para
grep
ou talvez ackOu esta maravilhosa construção:
fonte
-exec grep...
é melhor que o meuxargs
método, pois não engasga com espaços nos nomes de arquivos.find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Obviamente, as outras opções também podem ser adicionadas.fonte
Apenas para incluir mais uma alternativa, você também pode usar isto:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
Onde:
-regextype posix-extended
dizfind
que tipo de regex esperar-regex "^.*\.(php|html|js)$"
informafind
ao próprio regex que os nomes de arquivos devem corresponder-exec grep -EH '(document\.cookie|setcookie)' {} \;
dizfind
para executar o comando (com suas opções e argumentos) especificado entre a-exec
opção e o\;
de cada arquivo encontrado, onde{}
representa onde o caminho do arquivo está nesse comando.enquanto
E
opção dizgrep
para usar regex estendido (para apoiar os parênteses) e ...H
opção dizgrep
para imprimir caminhos de arquivo antes das correspondências.E, dado isso, se você quiser apenas caminhos de arquivo, poderá usar:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u
Onde
|
[pipe] envia a saída defind
para o próximo comando depois disso (que ésed
, entãosort
)r
opção dizsed
para usar regex estendido.s/HI/BYE/
dizsed
para substituir toda Primeira ocorrência (por linha) de "HI" por "BYE" e ...s/(^.*):.*$/\1/
diz para substituir o regex(^.*):.*$
(ou seja, um grupo [incluído entre()
] incluindo tudo [.*
= um ou mais caracteres] desde o início da linha [^
] até 'o primeiro': 'seguido de qualquer coisa até' o final de linha [$
]) pelo primeiro grupo [\1
] do regex substituído.u
diz a classificação para remover entradas duplicadas (usesort -u
como opcional).... Longe de ser a maneira mais elegante. Como eu disse, minha intenção é aumentar o leque de possibilidades (e também dar explicações mais completas sobre algumas ferramentas que você pode usar).
fonte