bash - script - Encontrar arquivos contendo um determinado texto




find name bash (4)

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 informa que tipo de regex deve ser esperado
  • -regex "^.*\.(php|html|js)$" informa que a própria regex deve ter nomes de arquivos
  • -exec grep -EH '(document\.cookie|setcookie)' {} \; diz ao find para executar o comando (com suas opções e argumentos) especificado entre a opção -exec e o \; para cada arquivo encontrado, onde {} representa onde o caminho do arquivo entra neste comando.

    enquanto

    • E opção E diz ao grep para usar o regex estendido (para suportar os parênteses) e ...
    • H opção H informa ao grep para imprimir os caminhos de arquivos antes dos jogos.

E, dado isso, se você quiser apenas caminhos de arquivo, você pode 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] enviar a saída de find para o próximo comando depois disso (que é sed , em seguida, sort )
  • r opção r diz ao sed para usar o regex estendido.
  • s/HI/BYE/ diz sed para substituir cada primeira ocorrência (por linha) de "HI" com "BYE" e ...
  • s/(^.*):.*$/\1/ diz para substituir o regex (^.*):.*$ (significando um grupo [coisas entre () ] incluindo tudo [ .* = um ou mais de qualquer caractere] desde o começo da linha [ ^ ] até 'o primeiro': 'seguido por qualquer coisa até' o fim da linha [ $ ]) pelo primeiro grupo [ \1 ] da regex substituída.
  • u diz ao sort para remover entradas duplicadas (tome a sort -u como opcional).

... Longe de ser o caminho 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ê poderia usar).

https://code.i-harness.com

No bash eu quero retornar o nome do arquivo (e o caminho para o arquivo) para cada arquivo do tipo .php|.html|.js contendo a string que não diferencia maiúsculas de minúsculas "document.cookie" | "setcookie" "document.cookie" | "setcookie"

Como eu faria isso?


Soa como um trabalho perfeito para grep ou talvez ack

Ou esta construção maravilhosa:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

find os e grep para a string:

Isto irá encontrar todos os arquivos de seus 3 tipos em / starting / path e grep para a expressão regular '(document\.cookie|setcookie)' . Dividir mais de 2 linhas com a barra invertida apenas para facilitar a leitura ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

Se você quiser apenas nomes de arquivos, adicione o sinalizador l (minúscula):

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .




find