Como excluir arquivos na linha de comando com expressões regulares?

17

Vamos dizer que eu tenho 20 arquivos chamados FOOXX, onde XX é o número do arquivo, por exemplo, 01, 02 etc.

No momento, se eu quiser apagar todos os arquivos menores que o número 10, isso é fácil e eu uso apenas um caractere curinga, por exemplo rm FOO0 *

No entanto, se eu quiser excluir arquivos específicos em um intervalo, por exemplo, 13-15, isso se torna mais difícil.

rm FPP [13-15] não funciona e me pergunta se desejo excluir todos os arquivos. O Likewse rm FOO1 [3-5] deseja deletar todos os arquivos que começam com FOO1

Então, qual é a melhor maneira de excluir intervalos de arquivos como este?

Eu tentei com bash e zsh, e eu não acho que eles diferem tanto para uma tarefa tão básica?

Jack
fonte
"... rm FOO1 [3-5] deseja deletar todos os arquivos que começam com FOO1" Isto não faz sentido, e certamente não é o caso aqui.
Ignacio Vazquez-Abrams
@Ignacio yeah- Eu gostaria de ver que o conjunto de caracteres tem essa ordem de agrupamento!
kmarsh

Respostas:

30

No bash você pode usar:

rm FOO1{3..5}

ou

rm FOO1{3,4,5}

para excluir FOO13, FOO14 e FOO15.

Bash expansões brace estão documentados Aqui .

Mike Fitzpatrick
fonte
2
Ou mesmo rm FOO{13..15}.
Ignacio Vazquez-Abrams
Isso também é verdade para o ZSH?
Jack
@ Jack: Sim, é.
Dennis Williamson
@Jack: bash Comandos formam subconjunto de z comandos de shell.
abhinavkulkarni
Então eu preciso aprender ambos sintaxe regex e globbing. Boohoo :)
Aditya M P
12

Para futuros leitores, o find comando também pode excluir arquivos. Eu resolvi isso para um problema semelhante:

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

mas a resposta escolhida é a resposta mais simples para essa pergunta.

GregWW
fonte
A resposta escolhida é boa apenas para arquivos que seguem uma convenção de nomenclatura. Graças à sua resposta, eu poderia excluir todos os arquivos de objeto em um diretório. (no meu caso eu só fui com find . -name "*.o" -delete e funcionou perfeitamente)
John Hamilton
6

ls | grep regex | xargs rm

gogiel
fonte
6
Você deveria usar find -regex ... -print0 | xargs -0 ... para isso, caso contrário, ele falhará para nomes de arquivos com espaços.
Dennis Williamson
1
Claro, se você vai usar find então você pode também apenas usar -exec.
Ignacio Vazquez-Abrams
No meu caso, os arquivos tinham espaços e, ao alterar o delimitador, a questão dos espaços é corrigida: ls | grep regex | xargs --delimiter = '\ n' rm
Anake
1
-1 para tentando analisar sl
evilsoup
@eviloup, +1 para adicionar esse aviso, mas, quem insere uma nova linha em um nome de arquivo?
Iulian Onofrei