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ãofile-3.html
: Este arquivo contém o texto "extract($_REQUEST)"
O comando que procuro excluirá os arquivos: file-1.php
e 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.php
e 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 1
e sem subdiretórios-type f
encontrando arquivos-exec
e para cada um execute este testefgrep
uma pesquisa de string simples-q
sem saída visível'extract($_REQUEST)'
para esta corda'{}'
no arquivo que você encontrou';'
[fim do executivo]
-not
não o próximo teste-exec
executivo novamentefgrep
fgrep novamente-vq
mas desta vez procure por linhas não correspondentes'extract($_REQUEST)'
mesmo padrão para procurar'{}'
no arquivo
';'
[fim do executivo]
-delete
exclua-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