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.
-r
realiza una búsqueda recursiva del patrón foo
en 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 -0
alimenta los nombres de archivo de grep
a rm -f
, separando las palabras por cero (nul) bytes (recuerde la -Z
opció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 Z
opció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 ImportantStuff
que no quiero eliminar y que obsolete ImportantStuff
contienen foo
, entonces pierdo ImportantStuff
(¡y no obsolete ImportantStuff
!) Cuando ejecuto este comando, porque $files
se rompe en espacios cuando se interpreta. Es peligroso poner una lista de nombres de archivo en una variable de shell escalar de esta manera.