Eu quero usar o truncate
comando para criar um grande número de pequenos arquivos para teste. Eu tentei o comando com um pequeno número de arquivos (100) e funcionou. Quando alterei o número para 1000000, ele relata um erro:
root:[~/data]# truncate -s 1k {1..100}
root:[~/data]# rm -rf *
root:[~/data]# truncate -s 1k {1..1000000}
-bash: /usr/bin/truncate: Argument list too long
root:[~/data]#
Como posso resolvê-lo? Eu tenho uma sensação de que xargs
poderia ser usado, mas não posso fazê-lo funcionar.
Você poderia fazer
(Isso deve funcionar com um shell com um eco embutido que não está sujeito a limites de comprimento de linha de comando. Também
xargs
divide a entrada em qualquer espaço em branco por padrão, mas isso não importa aqui.)O acima pode usar uma quantidade enorme de memória, então usar
seq
como no comentário de mosvy pode ser melhor:Eu costumo usar um loop embora (isso começa em
000000
, não1
e tem zeros à esquerda em todos os nomes):Ter um milhão de arquivos em um único diretório provavelmente será lento, então, a menos que você esteja testando apenas isso, pode ser uma boa ideia espalhá-los em subdiretórios, digamos:
Observe que, se você não puder criar os arquivos porque eles não se encaixam em uma linha de comando e contornar isso de alguma forma, provavelmente também não poderá removê-los
rm -f *
. Você precisaria remover toda a árvore recursivamente ou fazer algo comofind -maxdepth 1 -type f -delete
.Apenas adicionando uma nota à excelente resposta de @ilkkachu para explicar a lógica. O comando
chamadas
truncate
com um milhão de argumentos mais três (truncate
(argv[0]
)-s
e1k
) que está bem acima do limite padrão do número e tamanho cumulativo de argumentos e variáveis de ambiente para aexecve()
chamada do sistema na maioria dos sistemas. Daí o erro "Lista de argumentos muito longa" .Em vez disso, a solução proposta
apenas executa
truncate
(viaxargs
) quantas vezes forem necessárias com tantos argumentos (ao ladotruncate
de ,-s
e1k
que se repetem em cada chamada) quanto possível para evitar essa limitação daexecve()
chamada do sistema.