Eliminar archivos con expresión regular


Respuestas:


56

Puede usar el siguiente comando para eliminar todos los archivos que coincidan con sus criterios:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Cómo funciona:

  1. ls enumera todos los archivos (uno por línea ya que el resultado se canaliza).

  2. grep -P "^A.*[0-9]{2}$" filtra la lista de archivos y deja solo aquellos que coinciden con la expresión regular ^A.*[0-9]{2}$

    • .*indica cualquier número de apariciones de ., donde .hay un comodín que coincide con cualquier carácter.

    • [0-9]{2}indica exactamente dos ocurrencias de [0-9], es decir, cualquier dígito.

  3. xargs -d"\n" rmse ejecuta rm lineuna vez por cada linecosa que se canaliza a él.

Donde me equivoco

Para empezar, rmno acepta una expresión regular como argumento. Además del comodín *, todos los demás personajes se tratan literalmente.

Además, su expresión regular está ligeramente apagada. Por ejemplo, *significa cualquier ocurrencia de ...una expresión regular, por lo A*partidos A, AAetc., e incluso una cadena vacía.

Para obtener más información, visite Regular-Expressions.info .


3
Cuidado con los espacios en los nombres de archivo.
slhck

1
El -d"\ninterruptor soluciona el problema de espacios.
Viernes

1
Nota: algunas distribuciones (como Mac OS) no tienen una grep -P(expresión regular Perl). grep -Epuede funcionar en este caso.
bluescrubbie

1
Prefiero usar -Icon xargsy siempre probar primero con comandos no letales:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
Parsing ls? Vea esta pregunta que apunta a este artículo . Debido a las dificultades, es posible que rmlo que no quieres.
Kamil Maciorowski

46

O usando find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

Esta solución tratará con nombres de archivos extraños .


55
Esta es una gran solución. Lo prefiero porque es más simple y puede omitir el indicador -delete al final primero para ver si su expresión regular es correcta antes de eliminar en masa sus archivos.
JAMESSTONEco

1
Además se tiene más control sobre lo que se elimina, por ejemplo añadiendo-type f
Marco Sila

¿Se puede usar para eliminar archivos y carpetas? No funciona para carpetas no vacías.
Alex

@Alex no, el directorio debe estar vacío (de todos modos no era un requisito de OP), puede usar el xargsenfoque con rm -f.
cYrus


1

La solución con regexp es 200 veces mejor, incluso con eso puedes ver qué archivo se eliminará antes de usar el comando, cortando la tubería final:

ls | grep -P "^A.*[0-9]{2}$"

Entonces, si es correcto, simplemente use:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Esto es 200 veces mejor porque si trabajas con Unix es importante saber cómo usar grep. Es muy poderoso si sabes cómo usarlo.


1
Esto no parece agregar mucho más de lo que ya dice la respuesta de 4 años de Dennis .
8bittree

1
"200 veces" es bastante específico. Muchos otros comandos también son muy potentes, todo lo que necesita hacer es aprender a usarlos.
Glenn Jackman

1

Esto funciona en mi mac:

rm $(ls | grep -e '^A*[0..9]2$')


0

find El comando también funciona con expresiones regulares.

Comprueba qué archivos se van a eliminar

find . -regex '^A.*[0-9]{2}$'

Borrar archivos

find . -regex '^A.*[0-9]{2}$' -delete
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.