Você estava quase lá. A linha deve ficar assim:
for i in {3072..3583};do printf "2607:f4a0:3:0:250:56ff:feac:3%x\n" $i >> ipv6.txt;done
Explicação: Parece que você assumiu que, de alguma forma, o printf adicionaria os números que você forneceu ao número antes do espaço reservado. Não é assim que funciona. O que o printf faz é interpretar o que não é um espaço reservado como uma string e, em seguida, converter a entrada que você atribuiu a uma string (como a conversão é feita depende do marcador usado) e substituir o marcador por isso.
Então, printf "bla bla%x" 8
corresponde a bla bla8
e printf "500%x" 8
torna-se 5008
Portanto, você precisa substituir os últimos 3 dígitos pelo marcador de posição% xe depois dar os números decimais correspondentes ao intervalo hexadecimal c00-dff que é 3072-3583 em decimal (infelizmente o operador do intervalo bash não entende hexadecimal números).
A propósito, se você quiser começar a contar a partir de um número com menos de 3 dígitos, você também pode especificar um preenchimento para o espaço reservado. por exemplo, para os números 000-200, você usaria o espaço reservado %03x
. 0
é o caractere que você deseja usar para preencher números com menos de 3 dígitos e 3
é o tamanho mínimo de dígitos que você deseja ter.