Comando Linux para localizar e excluir arquivos que contêm um determinado texto

Comando Linux para localizar e excluir arquivos que contêm um determinado texto

Existe um comando de terminal para excluir arquivos que contêm um determinado texto?

Digamos que eu tenha três arquivos e alguns deles contenham o texto "extract($_REQUEST)":

  • file-1.php: Este arquivo contém o texto "extract($_REQUEST)"
  • file-2.txt: Eu não
  • file-3.html: Este arquivo contém o texto "extract($_REQUEST)"

O comando que procuro excluirá os arquivos: file-1.phpe file-3.html.


ATUALIZAR: O arquivo deve excluir o arquivoSOMENTE SE"extract($_REQUEST)" é a única linha de texto no arquivo. Veja os exemplos abaixo:

  • file-4.php: Este ficheiroAPENAScontém o texto "extract($_REQUEST)"
  • file-5.php: Este arquivo contém o texto "extract($_REQUEST)"e outras linhas de texto

Então o comando excluirá file-4.phpe não excluirá file-5.php.

Responder1

find  . -maxdepth 1 -type f \
  -exec fgrep -q  'extract($_REQUEST)' '{}' ';' \ 
  -not -exec fgrep -vq  'extract($_REQUEST)' '{}' ';' \ 
  -delete
  • find .pesquise o diretório atual
  • -maxdepth 1e sem subdiretórios
  • -type fencontrando arquivos
  • -exece para cada um execute este teste
    • fgrepuma pesquisa de string simples
      • -q sem saída visível
      • 'extract($_REQUEST)'para esta corda
      • '{}'no arquivo que você encontrou
      • ';' [fim do executivo]
  • -notnão o próximo teste
    • -execexecutivo novamente
      • fgrepfgrep novamente
        • -vqmas desta vez procure por linhas não correspondentes
        • 'extract($_REQUEST)'mesmo padrão para procurar
        • '{}'no arquivo
    • ';' [fim do executivo]
  • -deleteexclua-os

Isso funciona porque exec também é um teste e quando fgrep encontra uma correspondência, o teste é bem-sucedido e a exclusão é executada. se grep retornar falso, a exclusão não será feita.

Responder2

grep -FRl 'extract($_REQUEST)' | xargs rm -fv
  • grep- pesquise texto em arquivos.
  • -F- trate a string como está, ignore possíveis expressões regulares.
  • -R- pesquisa recursiva.
  • -l- imprime apenas nomes de arquivos.
  • xargs- forneça a saída para o próximo programa.
  • rm- remover.
  • -f- forçar (não pergunte "Tem certeza?").
  • -v- é opcional, irá exibir os arquivos que foram removidos.

ATUALIZAR:

Para excluir apenas os arquivos com texto exato, sugiro verificar também a quantidade de caracteres do arquivo.

for i in $(grep -FRl 'extract($_REQUEST)'); do [[ $(cat $i | wc -c) == "19" ]] && rm -fv $i; done
  • wc -c- conta os caracteres do arquivo. Como o exemplo que você forneceu ( extract($_REQUEST)) tem 19 caracteres (que inclui caracteres de nova linha), usei esse número em meu exemplo, fique à vontade para alterá-lo para se adequar à sua situação.

Responder3

Comando

find  . -maxdepth 1 -type f -exec grep -l  "string_to_be_searched" {} \;|awk '{print $1}'| sed "s/\.\///g"| awk '{print "rm -rvf" " " $1}'| sh

Nota: Testei e funcionou bem

informação relacionada