Aquí hay una manera segura:
grep -lrIZ foo . | xargs -0 rm -f --
-l imprime los nombres de los archivos que coinciden con el patrón de búsqueda.
-rrealiza una búsqueda recursiva del patrón fooen el directorio dado .. Si esto no funciona, inténtalo -R.
-I(capital i) hace que se omitan los archivos binarios como los PDF.
-Z garantiza que los nombres de los archivos estén terminados en cero (es decir, nul-) para que un nombre que contenga espacios en blanco no se interprete de manera incorrecta (es decir, como nombres múltiples en lugar de uno).
xargs -0alimenta los nombres de archivo de grepa rm -f, separando las palabras por cero (nul) bytes (recuerde la -Zopción de grep).
--a menudo se olvida, pero es muy importante marcar el final de las opciones y permitir la eliminación de archivos cuyos nombres comienzan con -.
Si desea ver qué archivos están a punto de eliminarse, simplemente elimine la | xargs -0 rm -f --pieza y desactive la Zopción grep.
Otro usuario sugirió algo como lo siguiente, que no debe ejecutar porque no es seguro:
files=`grep foo * | cut -d: -f1`
rm -f $files # unsafe, do not run it!
Si tengo archivos ImportantStuffque no quiero eliminar y que obsolete ImportantStuffcontienen foo, entonces pierdo ImportantStuff(¡y no obsolete ImportantStuff !) Cuando ejecuto este comando, porque $filesse rompe en espacios cuando se interpreta. Es peligroso poner una lista de nombres de archivo en una variable de shell escalar de esta manera.