A limitação está no tamanho dos argumentos em execução de um comando. Portanto, as opções são executar um comando com menos argumentos, por exemplo, com xargs
para executar lotes menores, aumentar o limite ( ulimit -s 100000
no Linux), não executar nada (fazer tudo no shell) ou criar a lista na ferramenta que cria os arquivos.
zsh
, ksh93
, bash
:
printf '%s ' {1..1391803} | xargs touch
printf
está incorporado, por isso não há exec
, por isso o limite não é atingido. xargs
divide a lista de argumentos passados para touch
para evitar quebrar o limite. Isso ainda não é muito eficiente, pois o shell precisa primeiro criar toda a lista (lenta especialmente com bash
), armazená-la na memória e depois imprimi-la.
seq 1391803 | xargs touch
(supondo que você tenha um comando seq
) seria mais eficiente.
for ((i=1; i<=1391803; i++)); do : >> "$i"; done
Tudo é feito no shell, sem lista grande armazenada na memória. Deve ser relativamente eficiente, exceto talvez com bash
.
POSIXly:
i=1; while [ "$i" -le 1391803 ]; do : >> "$i"; i=$(($i + 1)); done
echo 'for (i=1;i<=1391803;i++) i' | bc | xargs touch
awk 'BEGIN {for (i=1; i<=1391803; i++) {printf "" >> i; close(i)}}'