Excluir arquivos com expressão regular


41

Tentei excluir arquivos que começam com A e terminam com 2 números, mas isso não faz nada.
O que eu tentei:

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

Onde eu estou errado?

Respostas:


56

Você pode usar o seguinte comando para excluir todos os arquivos que correspondem aos seus critérios:

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

Como funciona:

  1. ls lista todos os arquivos (um por linha, pois o resultado é canalizado).

  2. grep -P "^A.*[0-9]{2}$" filtra a lista de arquivos e deixa apenas aqueles que correspondem à expressão regular ^A.*[0-9]{2}$

    • .*indica qualquer número de ocorrências de ., em que .um curinga corresponde a qualquer caractere.

    • [0-9]{2}indica exatamente duas ocorrências de [0-9], ou seja, qualquer dígito.

  3. xargs -d"\n" rmexecuta rm lineuma vez para cada linecanal direcionado a ele.

Onde eu estou errado?

Para iniciantes, rmnão aceita uma expressão regular como argumento. Além do curinga *, todos os outros caracteres são tratados literalmente.

Além disso, sua expressão regular está um pouco desligada. Por exemplo, *significa quaisquer ocorrências ...em uma expressão regular, de modo A*partidas A, AAetc. e mesmo uma cadeia vazia.

Para mais informações, visite Regular-Expressions.info .


3
Cuidado com os espaços nos nomes dos arquivos.
slhck 22/02

1
O -d"\ninterruptor corrige o problema de espaços.
Frg

1
Nota - algumas distros (como o Mac OS) não têm um grep -P(regex Perl). grep -Epode funcionar neste caso.
Bluescrubbie #

1
Eu prefiro usar -Icom xargse sempre testar com comandos não-letais primeiro:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
Analisando ls? Veja esta pergunta que aponta para este artigo . Por causa das armadilhas, você pode rmo que não quer.
Kamil Maciorowski

46

Ou usando find:

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

Esta solução irá lidar com nomes de arquivos estranhos .


5
Esta é uma otima soluçao. Eu prefiro porque é mais simples e você pode omitir o sinalizador -delete no final primeiro para ver se o seu regex está correto antes de excluir em massa seus arquivos.
JAMESSTONEco

1
Além disso, você tem mais controle sobre o que excluir, por exemplo, adicionando-type f
Marco Sulla 8/16

Isso pode ser usado para excluir arquivos e pastas? Não funciona para pastas não vazias.
Alex

@ Alex Não, o diretório deve estar vazio (não era um requisito de OP de qualquer maneira), você pode usar a xargsabordagem com rm -f.
precisa


1

A solução com regexp é 200 vezes melhor, mesmo com isso você pode ver qual arquivo será excluído antes de usar o comando, cortando o tubo final:

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

Então, se estiver correto, use:

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

Isso é 200 vezes melhor, porque se você trabalha com Unix, é importante saber como usar o grep. É muito poderoso se você souber usá-lo.


1
Isso não parece acrescentar muito além do que a resposta de 4 anos de Dennis já diz.
8bittree

1
"200 vezes" é bastante específico. Muitos outros comandos também são muito poderosos, tudo que você precisa fazer é aprender a usá-los.
Glenn Jackman

1

Isso funciona no meu mac:

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


0

find O comando funciona com regexes também.

Verifique quais arquivos serão excluídos

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

Deletar arquivos

find . -regex '^A.*[0-9]{2}$' -delete
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.