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?
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:
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:
ls
lista todos os arquivos (um por linha, pois o resultado é canalizado).
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.
xargs -d"\n" rm
executa rm line
uma vez para cada line
canal direcionado a ele.
Onde eu estou errado?
Para iniciantes, rm
nã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
, AA
etc. e mesmo uma cadeia vazia.
Para mais informações, visite Regular-Expressions.info .
-d"\n
interruptor corrige o problema de espaços.
grep -P
(regex Perl). grep -E
pode funcionar neste caso.
-I
com xargs
e sempre testar com comandos não-letais primeiro:xargs -d"\n" -I {} echo "{}"
ls
? Veja esta pergunta que aponta para este artigo . Por causa das armadilhas, você pode rm
o que não quer.
Ou usando find
:
find your-directory/ -name 'A*[0-9][0-9]' -delete
Esta solução irá lidar com nomes de arquivos estranhos .
-type f
xargs
abordagem com rm -f
.
Consulte a seção de expansão de nome de arquivo da página de manual do bash:
rm A*[0-9][0-9]
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.
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