Como executar um comando para cada número em um intervalo

2

Eu quero fazer algo como

specmd file5.awe
specmd file6.awe
specmd file7.awe
specmd file8.awe
specmd file9.awe
specmd file10.awe
specmd file11.awe
specmd file12.awe

Existe uma boa maneira de fazer isso? A melhor maneira que posso pensar é algo como

ruby -e "10.upto(15){|i| puts i}" | xargs -I {} specmd file{}.awe

O que obviamente não é uma boa maneira de fazer isso, pois depende do rubi e parece que o rubi não deve ser necessário neste caso.

Nota: existem mais arquivos (por exemplo: file4.awe , file13.awe ) que eu não quero, então qualquer globbing (provavelmente?) não fará o que eu quero.

    
por Shelvacu 05.12.2015 / 09:08

6 respostas

4

No bash, você pode criar loops usando o comando builtin para iterar por um intervalo:

for i in {5..12}
do 
    specmd file${i}.awe
done

Existem mais opções para outras situações semelhantes, vou deixar aqui um link para isso.

link

    
por 05.12.2015 / 09:20
4

Eu sei que esta é uma pergunta antiga, mas eu não pude resistir.

Não é necessário loop, não é necessário loop while, apenas o bash puro da linha de comandos:

echo file{5..12}.awe | xargs -n1 specmd
    
por 09.02.2017 / 21:31
3
for f in file[5-9].awe file1[012].awe
do  : stuff with "$f" files
done

... não todas as globs são iguais.

outra coisa que você pode fazer:

x=4
while  [ 13 -gt "$((x+=1))" ]
do     : stuff with "file$x.awe"
done

... que tem a vantagem de gerar seu iterador enquanto iterativo e funciona por padrão em praticamente qualquer shell com script (como também é verdade para os globs) .

    
por 05.12.2015 / 09:29
3

Com zsh você pode simplificar o comando com um "loop" especial repeat :

n=5; m=12; repeat $((m-n+1)) specmd file$((n++)).awe
    
por 05.12.2015 / 10:05
0

Usando um loop de estilo C em bash ou ksh93 :

for ((i=5;i<=12;++i)); do specmd "file$i.awe"; done

Usando a expansão de chaves:

for f in file{5..13}.awe; do specmd "$f"; done

Ou, com xargs , de um modo semelhante ao que você tinha:

printf '%s\n' {5..13} | xargs -I {} specmd file{}.awe
    
por 09.02.2017 / 23:21
0

Mais alternativas para zsh

autoload zargs # best in ~/.zshrc
zargs -n1 file{5..12}.awe -- specmd

ou:

for f (file{5..12}.awe) specmd $f
    
por 09.02.2017 / 23:36

Tags