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:
-l
imprime los nombres de los archivos que coinciden con el patrón de búsqueda.-r
realiza una búsqueda recursiva del patrónfoo
en el directorio dado.
. Si esto no funciona, inténtalo-R
.-I
(capitali
) 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 degrep
arm -f
, separando las palabras por cero (nul) bytes (recuerde la-Z
opció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 laZ
opcióngrep
.Otro usuario sugirió algo como lo siguiente, que no debe ejecutar porque no es seguro:
Si tengo archivos
ImportantStuff
que no quiero eliminar y queobsolete ImportantStuff
contienenfoo
, entonces pierdoImportantStuff
(¡y noobsolete 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.fuente
Esto busca de forma recursiva los archivos que contienen
foo
. El segundo-exec
solo se ejecuta si el primeroexec
sale con éxito, es decir, sigrep
coincide. Ejecute en seco y elimineecho
si 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,find
también puede eliminar archivos). Tenga en cuenta quegrep
acepta una expresión regular. Si desea buscarfoo.bar
, salga de esto o pase la-F
opción de tratar el patrón como literal.-exec echo rm "{}" \;
y no-delete
?-delete
. Es más fácil demostrar con el segundo-exec
y hacer eco en su lugar.-print
(o-ls
para 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