¿Existe un comando de terminal para eliminar archivos que contienen un texto determinado?
Digamos que tengo tres archivos y algunos de ellos contienen el texto "extract($_REQUEST)":
file-1.php
: Este archivo contiene el texto "extract($_REQUEST)"file-2.txt
: Nofile-3.html
: Este archivo contiene el texto "extract($_REQUEST)"
El comando que estoy buscando eliminará los archivos: file-1.php
y file-3.html
.
ACTUALIZAR: El archivo debe eliminar el archivo.SÓLO SI"extract($_REQUEST)" es la única línea de texto del archivo. Vea los ejemplos a continuación:
file-4.php
: Este archivoJUSTOcontiene el texto "extraer ($_REQUEST)"file-5.php
: Este archivo contiene el texto "extract($_REQUEST)"y otras líneas de texto
Entonces el comando eliminará file-4.php
y no eliminará file-5.php
.
Respuesta1
find . -maxdepth 1 -type f \
-exec fgrep -q 'extract($_REQUEST)' '{}' ';' \
-not -exec fgrep -vq 'extract($_REQUEST)' '{}' ';' \
-delete
find .
buscar en el directorio actual-maxdepth 1
y sin subdirectorios-type f
encontrar archivos-exec
y para cada uno ejecuta esta pruebafgrep
una búsqueda de cadena simple-q
sin salida visible'extract($_REQUEST)'
para esta cadena'{}'
en el archivo que encontraste';'
[fin del ejecutivo]
-not
no la próxima prueba-exec
ejecutivo de nuevofgrep
fgrep de nuevo-vq
pero esta vez busca líneas que no coincidan'extract($_REQUEST)'
mismo patrón a buscar'{}'
en el archivo
';'
[fin del ejecutivo]
-delete
borra los
Esto funciona porque exec también es una prueba y cuando fgrep encuentra una coincidencia, la prueba tiene éxito y se ejecuta la eliminación. Si grep devuelve falso, la eliminación no se realiza.
Respuesta2
grep -FRl 'extract($_REQUEST)' | xargs rm -fv
grep
- buscar texto en archivos.-F
- Trate la cadena como está, ignore posibles expresiones regulares.-R
- búsqueda recursiva.-l
- sólo imprime nombres de archivos.xargs
- dar la salida al siguiente programa.rm
- eliminar.-f
- fuerza (no preguntes "¿Estás seguro?").-v
- es opcional, recuperará los archivos que se eliminaron.
ACTUALIZAR:
Para eliminar sólo los archivos con texto exacto, sugiero comprobar también la cantidad de caracteres del archivo.
for i in $(grep -FRl 'extract($_REQUEST)'); do [[ $(cat $i | wc -c) == "19" ]] && rm -fv $i; done
wc -c
- cuenta los caracteres del archivo. Dado que el ejemplo que proporcionó (extract($_REQUEST)
) tiene 19 caracteres (que incluyen caracteres de nueva línea), utilicé este número en mi ejemplo, no dude en cambiarlo para adaptarlo a su situación.
Respuesta3
Dominio
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: Probado y funcionó bien.