¿Cómo eliminar archivos en la línea de comandos con expresiones regulares?


18

Digamos que tengo 20 archivos llamados FOOXX, donde XX es el número del archivo, por ejemplo, 01, 02, etc.

Por el momento, si quiero eliminar todos los archivos inferiores al número 10, esto es fácil y solo uso un comodín, por ejemplo, rm FOO0 *

Sin embargo, si quiero eliminar archivos específicos en un rango, por ejemplo, 13-15, esto se vuelve más difícil.

rm FPP [13-15] no funciona y me pregunta si deseo eliminar todos los archivos. Likewse rm FOO1 [3-5] desea eliminar todos los archivos que comienzan con FOO1

Entonces, ¿cuál es la mejor manera de eliminar rangos de archivos como este?

¿He intentado con bash y zsh, y no creo que difieran tanto para una tarea tan básica?


"... rm FOO1 [3-5] desea eliminar todos los archivos que comienzan con FOO1" Esto no tiene sentido, y ciertamente no es el caso aquí.
Ignacio Vazquez-Abrams

@Ignacio sí, ¡me gustaría ver que el conjunto de caracteres tenga ese orden de clasificación!
kmarsh

Respuestas:


31

En bash puedes usar:

rm FOO1 {3..5}

o

rm FOO1 {3,4,5}

para eliminar FOO13, FOO14 y FOO15.

Las expansiones Bash se documentan aquí .


2
O incluso rm FOO{13..15}.
Ignacio Vazquez-Abrams

¿Es esto también cierto para ZSH?
Jack

@ Jack: Sí, lo es.
Pausado hasta nuevo aviso.

@Jack: los bashcomandos forman un subconjunto de zcomandos de shell.
abhinavkulkarni

Así que necesito aprender tanto la expresión regular como la sintaxis global. Boohoo :)
MP Aditya

13

Para futuros lectores, el findcomando también puede eliminar archivos. Me decidí por esto por un problema similar:

find . -type f -regex '...' -delete

pero la respuesta elegida es la respuesta más simple a esta pregunta.


Sin embargo, la respuesta elegida solo es buena para los archivos que siguen una convención de nomenclatura. Gracias a su respuesta, pude eliminar todos los archivos de objetos en un directorio. (en mi caso, simplemente fui find . -name "*.o" -deletey funcionó de maravilla)
John Hamilton

6

ls | grep regex | xargs rm


66
Debe usar find -regex ... -print0 | xargs -0 ...para esto, de lo contrario, fallará para los nombres de archivo con espacios.
Pausado hasta nuevo aviso.

1
Por supuesto, si vas a usar, findentonces también puedes usarlo -exec.
Ignacio Vazquez-Abrams

En mi caso, los archivos tenían espacios, y cambiar el delimitador corrige el problema de espacios: ls | grep regex | xargs --delimiter = '\ n' rm
Anake


@evilsoup, +1 por agregar esa advertencia, pero, ¿quién inserta una nueva línea en un nombre de archivo?
Iulian Onofrei
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.