Excluir arquivos com base no padrão

1

Isso pode ter sido endereçado em algum lugar, mas não conseguimos encontrar o comando que atenda ao meu requisito.

Então basicamente vamos dizer que existem 51 arquivos começando com aaa.log aaa.log.1 aaa.log.2 . aaa.log.4 aaa.log.40 aaa.log.41 . . aaa.log.50

Agora, pretendo excluir arquivos com aaa.log.40 para aaa.log.50.

Se eu executar o rm -f aaa.log.4 *, ele excluirá tudo, inclusive aaa.log.4 Que ajuste devo usar para que exclua apenas aaa.log.40 a 50, mas não aaa.log.4?

    
por avanish 12.05.2016 / 08:21

3 respostas

4

O shell padrão no Ubuntu é bash . Em bash (e provavelmente muitos outros shells também) você pode fazer assim:

rm -f aaa.log.{40..50}

A expansão {40..50} se expande para o intervalo de número de 40 a 50 e automaticamente faz com que o restante da palavra seja duplicado com cada número expandido. Ele não verificará a existência dos nomes de arquivos, portanto, pode ser que rm receba nomes de arquivos não existentes. No entanto, desde que você aparentemente queria usar a opção de força de qualquer maneira, isso não é um problema. Quando você digita rm -f , ele não imprime nenhuma mensagem de erro sobre arquivos ausentes.

Geralmente, é uma boa ideia testar o comando com echo na frente, se você não estiver familiarizado com a expansão. Então você pode ver o que os argumentos expandem para:

echo rm -f aaa.log.{40..50}
    
por 12.05.2016 / 09:08
1

Além da resposta de @ kasperd, o seguinte pode ser útil: se os números não forem sequenciais (por exemplo, 20-30 e 50-60), pode-se fazer o seguinte:

rm aaa.log.{2,3,5,6}[0-9]

O que removerá todas as ocorrências de arquivos com caudas que terminem em 2, 3, 5 ou 6, seguidos por qualquer número no intervalo de 0 a 9.

Atualização: @janos apontou que isso removerá 31-39 e 61-69, assim como os outros arquivos listados.

    
por 13.05.2016 / 12:00
0

Se você usar zsh com globbing estendido, poderá usar rm aaa.<40-50> .

    
por 12.05.2016 / 08:31

Tags