Quiero eliminar todos los archivos que contienen la cadena foo. ¿Cómo puedo hacer esto usando bash en Linux?
linux
command-line
bash
find
Kitsos
fuente
fuente

foo(pmyfoo.jpg. Ej. ) O archivos que contienen la secuencia de bytesfoo(que pueden incluir archivos binarios que contienen esa secuencia de bytes)?Respuestas:
Aquí hay una manera segura:
-limprime los nombres de los archivos que coinciden con el patrón de búsqueda.-rrealiza una búsqueda recursiva del patrónfooen el directorio dado.. Si esto no funciona, inténtalo-R.-I(capitali) hace que se omitan los archivos binarios como los PDF.-Zgarantiza 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 degreparm -f, separando las palabras por cero (nul) bytes (recuerde la-Zopción degrep).--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 laZopcióngrep.Otro usuario sugirió algo como lo siguiente, que no debe ejecutar porque no es seguro:
Si tengo archivos
ImportantStuffque no quiero eliminar y queobsolete ImportantStuffcontienenfoo, entonces pierdoImportantStuff(¡y noobsolete 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.fuente
Esto busca de forma recursiva los archivos que contienen
foo. El segundo-execsolo se ejecuta si el primeroexecsale con éxito, es decir, sigrepcoincide. Ejecute en seco y elimineechosi la salida parece correcta.O alternativamente
y
según lo sugerido por Lekensteyn.
fuente
find -type f -exec grep -q 'foo' {} \; -delete(las comillas{}son redundantes,findtambién puede eliminar archivos). Tenga en cuenta quegrepacepta una expresión regular. Si desea buscarfoo.bar, salga de esto o pase la-Fopción de tratar el patrón como literal.-exec echo rm "{}" \;y no-delete?-delete. Es más fácil demostrar con el segundo-execy hacer eco en su lugar.-print(o-lspara más verbosidad) que-exec echo rm "{}" \'. No hay necesidad de utilidades externas.Haría lo que Adrian dice:
Pero agregaría límites de palabras al foo para no eliminar accidentalmente archivos que contengan "comida" (a menos que esté borrando todo lo que contiene comida es lo que desea).
agudamente, redirigiría la salida antes de eliminar para poder revisar antes de eliminar:
fuente