Comando de Linux para buscar y eliminar archivos que contienen un texto determinado

Comando de Linux para buscar y eliminar archivos que contienen un texto determinado

¿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: No
  • file-3.html: Este archivo contiene el texto "extract($_REQUEST)"

El comando que estoy buscando eliminará los archivos: file-1.phpy 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.phpy 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 1y sin subdirectorios
  • -type fencontrar archivos
  • -execy para cada uno ejecuta esta prueba
    • fgrepuna búsqueda de cadena simple
      • -q sin salida visible
      • 'extract($_REQUEST)'para esta cadena
      • '{}'en el archivo que encontraste
      • ';' [fin del ejecutivo]
  • -notno la próxima prueba
    • -execejecutivo de nuevo
      • fgrepfgrep de nuevo
        • -vqpero esta vez busca líneas que no coincidan
        • 'extract($_REQUEST)'mismo patrón a buscar
        • '{}'en el archivo
    • ';' [fin del ejecutivo]
  • -deleteborra 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.

información relacionada