Eliminar archivos con expresión regular

41

Intenté eliminar archivos que comienzan con A y terminan con 2 números, pero no hace nada.
Lo que probé:

rm ^A*[0..9]2$

Donde me equivoco

gdoron está apoyando a Monica
fuente

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 .

Dennis
fuente
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 .

Ciro
fuente
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
10

Consulte la sección de expansión de nombre de archivo de la página de manual de bash:

rm A*[0-9][0-9]
Glenn Jackman
fuente
funcionó muy bien para mí.
Nishanth Matha
Esta fue la respuesta más simple pero completa a la pregunta.
Janac Meena
¿Funcionará esto si la carpeta tiene muchos archivos?
Itay
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.

Salvatore
fuente
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$')

Rayo
fuente
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
Petr Javorik
fuente