varios txt todos script por para otro mover los extension eliminar directorio crear como borrar archivos linux file find command-line-interface rm

txt - rm linux



Eliminar archivos con la cadena encontrada en el archivo-linux cli (7)

@Martin Beckett publicó una excelente respuesta, por favor siga esa guía

solución para su comando:

grep -l [email protected] * | xargs rm

O

for file in $(grep -l [email protected] *); do rm -i $file; # ^ prompt for delete done

Estoy tratando de eliminar correos electrónicos erróneos basados ​​en encontrar la dirección de correo electrónico en el archivo a través de Linux CLI.

Puedo conseguir los archivos con

find . | xargs grep -l [email protected]

Pero no puedo averiguar cómo eliminarlos desde allí ya que el siguiente código no funciona.

rm -f | xargs find . | xargs grep -l [email protected]

Gracias por su asistencia.


A pesar de la respuesta segura de Martin, si tiene la certeza de lo que desea eliminar, como al escribir un guión, lo he utilizado con mayor éxito que cualquier otra frase de una línea sugerida anteriormente:

$ find . | grep -l [email protected] | xargs -I {} rm -rf {}

Pero prefiero encontrar por nombre:

$ find . -iname *something* | xargs -I {} echo {}


Me gustó la solución de Martin Beckett, pero descubrí que los nombres de archivo con espacios podrían hacerla tropezar (como quién usa espacios en los nombres de archivo, pfft: D). También quería revisar qué coincidía, así que muevo los archivos coincidentes a una carpeta local en lugar de simplemente eliminarlos con el comando ''rm'':

# Make a folder in the current directory to put the matched files $ mkdir -p ''./matched-files'' # Create a script to move files that match the grep # NOTE: Remove "-name ''*.txt''" to allow all file extensions to be searched. # NOTE: Edit the grep argument ''something'' to what you want to search for. $ find . -name ''*.txt'' -print0 | xargs -0 grep -al ''something'' | awk -F ''/n'' ''{ print "mv /""$0"/" ./matched-files" }'' > doit.sh Or because its possible (in Linux, idk about other OS''s) to have newlines in a file name you can use this longer, untested if works better (who puts newlines in filenames? pfft :D), version: $ find . -name ''*.txt'' -print0 | xargs -0 grep -alZ ''something'' | awk -F ''/0'' ''{ for (x=1; x<NF; x++) print "mv /""$x"/" ./matched-files" }'' > doit.sh # Evaluate the file following the ''source'' command as a list of commands executed in the current context: $ source doit.sh

NOTA: tuve problemas donde grep no pudo coincidir dentro de los archivos que tenían la codificación utf-16. Vea here para una solución. En caso de que el sitio web desaparezca, lo que hace es usar grep -a, que hace que grep trate los archivos como texto y use un patrón de expresiones regulares que coincida con cualquier primer byte en cada carácter extendido. Por ejemplo, para hacer coincidir Entité hacer esto:

grep -a ''Entit.e''

y si eso no funciona, intente esto:

grep -a ''E.n.t.i.t.e''


Por seguridad, normalmente canalizo la salida de find a algo como awk y creo un archivo por lotes con cada línea siendo "rm filename"

De esa manera, puede comprobarlo antes de ejecutarlo y corregir manualmente cualquier caso de borde impar que sea difícil de hacer con una expresión regular

find . | xargs grep -l [email protected] | awk ''{print "rm "$1}'' > doit.sh vi doit.sh // check for murphy and his law source doit.sh


Puede usar find ''s -exec y -delete , solo eliminará el archivo si el comando grep correctamente. Si usa grep -q para que no imprima nada, puede reemplazar la -q con -l para ver qué archivos tenían la cadena.

find . -exec grep -q ''[email protected]'' ''{}'' /; -delete



rm -f `find . | xargs grep -li [email protected]`

hace el trabajo mejor Use `...` para ejecutar el comando para ofrecer los nombres de archivo que contienen el correo electrónico. @ Domain.com (grep -l los lista, -i ignora el caso) para eliminarlos con rm (-f forcibly / -i interactively).