Como removo vários arquivos com um prefixo e um sufixo comuns?

19

Eu tenho muitos arquivos nomeados

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

e arquivos nomeados

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

e arquivos nomeados

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

e

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

Eu só quero remover os arquivos que começam com 'sequence_1' e terminam em '.hmf', mas não quero removê-los um por um, pois há milhares de arquivos. Como eu posso especificar para o comando rm que eu quero remover todos os que começam com o prefilx 'sequence_1' e terminam em '.hmf'?

Atualmente estou trabalhando com um sistema Linux RedHat, mas gostaria de saber como fazê-lo em outras distribuições também.

    
por Paul 26.04.2012 / 15:34

3 respostas

27
rm sequence_1*.hmf

remove os arquivos que começam com sequence_1 e terminam com .hmf .

Globbing é o processo no qual o shell usa um padrão e o expande em uma lista de nomes de arquivos correspondentes a esse padrão. Não confunda com expressões regulares, o que é diferente. Se você passa a maior parte do tempo em bash , o Wiki do Wooledge tem uma boa página sobre globbing (expansão do nome do caminho) . Se você deseja portabilidade máxima, leia a especificação POSIX na correspondência de padrões bem / em vez disso.

No caso improvável de você encontrar um erro "Argument list too long" , dê uma olhada em BashFAQ 95 , que aborda isso. A solução mais simples é dividir o padrão glob em vários fragmentos menores, até que o erro desapareça. No seu caso, você provavelmente poderia separar a correspondência por dígitos de prefixo de 0 a 9, da seguinte maneira:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case
    
por 26.04.2012 / 15:43
12

Embora a resposta do jw013 seja correta, isso pode falhar se você tiver milhares de combinações: a linha de comando expandida rm sequence_1_0001.hmf sequence_1_0002.hmf ... gerada pelo shell pode simplesmente ser muito grande.

Como Dom sugeriu, você também pode usar a opção -delete com find :

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

Ambos, -maxdepth e -delete , embora não estejam no padrão POSIX são bastante comuns em find implementações na natureza. As distribuições Linux geralmente usam o GNU find , o que certamente suporta essas opções.

    
por 26.04.2012 / 15:53
5
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

também funcionaria no Bash.

    
por 27.04.2012 / 01:41

Tags