Como criar um arquivo grande no UNIX?

17

Eu encontrei uma maneira no Windows de fazer isso

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

Existe uma maneira no UNIX de copiar um arquivo, anexar e depois repetir o processo? Algo como for .. cat file1.txt > file1.txt?

Thomas Lee
fonte
Por que copiar o arquivo e anexá-lo em vez de apenas anexá-lo?
123
@ 123 anexar é bom, mas como fazer o loop?
Thomas Lee
4
for i in {1..1000000};do echo "string" >> file;donena festança.
123
9
Tem que ser um arquivo de texto? Você pode criar qualquer tamanho de arquivo em / dev / zero ou / dev / urandom.
RealSkeptic
2
Eu esperaria type file >> fileexecutar em um loop infinito (pelo menos assim que for suficientemente grande para não caber em um buffer).
Stéphane Chazelas

Respostas:

29
yes "Some text" | head -n 100000 > large-file

Com csh/ tcsh:

repeat 10000 echo some test > large-file

Com zsh:

{repeat 10000 echo some test} > large-file

Nos sistemas GNU, consulte também:

seq 100000 > large-file

Ou:

truncate -s 10T large-file

(cria um arquivo esparso de 10TiB (muito grande, mas não ocupa espaço no disco)) e as outras alternativas discutidas em "Criar um arquivo de teste com lotes de zero bytes" .


Fazer cat file >> fileseria uma má ideia.

Primeiro, ele não funciona com algumas catimplementações que se recusam a ler arquivos iguais ao seu arquivo de saída. Mas mesmo se você o contornar cat file | cat >> file, se filefor maior que cato buffer interno, isso causaria cata execução em um loop infinito, pois acabaria lendo os dados que ele escreveu anteriormente.

Em sistemas de arquivos apoiados por um disco rígido rotacional, também seria bastante ineficiente (depois de atingir um tamanho maior do que o que possivelmente seria armazenado em cache na memória), pois a unidade precisaria ir e voltar entre o local em que os dados foram lidos, e que onde escrevê-lo.

Stéphane Chazelas
fonte
19
Ou dd if=/dev/zero of=large-file bs=1024 count=1024para um arquivo de 1 MB
doneal24
7
@ DougO'Neal acho dd if=/dev/zero of=test bs=1M count=1mais claro.
123
4
@ DougO'Neal, consulte Criar um arquivo de teste com lotes de zero bytes
Stéphane Chazelas
1
Ou use / dev / urandom em vez de / dev / zero se desejar dados aleatórios.
user253751
3
@ robertotomás sim, todo mundo usa dd, mas eu nunca entendi o porquê. Na verdade, acho que só o usei para ler um MBR ou tarefas adicionais similares. Na minha experiência, outras ferramentas são mais rápidas, mais simples e seguras para a grande maioria dos casos em que as pessoas usam dd. Eu acho que esse é um daqueles casos em que comum! = Ótimo, como sudo suou cat file | grep foo.
terdon
22

Você pode criar um arquivo grande no Solaris usando:

mkfile 10g /path/to/file

Outra maneira que funciona no Solaris (e Linux):

truncate -s 10g /path/to file

Também é possível usar:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
Lambert
fonte
o dd one é como um terabyte #
1233
1
Definir "um grande arquivo" :-) Mas eu editado desde as outras amostras tudo 10g estado ...
Lambert
truncado Não é possível executar 'truncado'. Nenhum desses arquivos ou diretórios Truncate parece ser apenas Linux.
schily 11/03
truncateexiste no Solaris 11.2+
Lambert
11

A maneira mais rápida possível de criar um arquivo grande em um sistema Linux é fallocate:

sudo fallocate -l 2G bigfile

fallocatemanipula o sistema de arquivos e, na verdade, não grava nos setores de dados por padrão e, como tal, é extremamente rápido. A desvantagem é que ela deve ser executada como raiz.

Executando-o sucessivamente em um loop, você pode preencher o maior dos sistemas de arquivos em questão de segundos.

A partir de man fallocate

fallocate é usado para manipular o espaço em disco alocado para um arquivo, para desalocá-lo ou pré-alocá-lo.
Para sistemas de arquivos que suportam a chamada do sistema fallocate, a pré-alocação é feita rapidamente alocando blocos e marcando-os como não inicializados, não exigindo E / S para os blocos de dados. Isso é muito mais rápido do que criar um arquivo preenchendo-o com zeros.
Suportado para XFS (desde o Linux 2.6.38), ext4 (desde o Linux 3.0), Btrfs (desde o Linux 3.7) e tmpfs (desde o Linux 3.5).

Rui F Ribeiro
fonte
1
Essa deve ser a resposta aceita. Fácil e rápido.
ardochhigh
8

Isso continuará até você CTRL-C:

yes This is stuff that I want to put into my file... >> dummy.txt

Tenha cuidado, pois você pode obter centenas de milhares de linhas / segundo ...

De man yes:

yes - output a string repeatedly until killed
Ponto de interrogação
fonte
Este é um método muito fácil de criar um arquivo grande no ambiente linux.
Chaminda Bandara 16/03
1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtpermitiria obter uma quantidade precisa. (-n $ TARGET_NUMBER_OF_LINES). yesmorreria automaticamente como resultado de um 'cano quebrado' quando headtermina porque o número de destino foi atingido.
PypeBros 18/07
4

Se eu entendi direito, você está procurando algo como:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

Isso criará um arquivo com 22 repetições da "linha de teste". Se você deseja um tamanho de arquivo específico, pode usar algo assim (no Linux). 1024 é um kilobyte:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

Pessoalmente, quando quero criar um arquivo grande, uso dois arquivos e coloco um no outro. Você pode repetir o processo até atingir o tamanho desejado (1 MB aqui):

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

Observe que essa solução geralmente excede o tamanho desejado, porque se o arquivo estiver abaixo do limite, tudo será novamente nele.

Por fim, se tudo o que você deseja é um arquivo do tamanho desejado e não precisa que ele realmente contenha nada, você pode usar truncate:

truncate -s 1M file
terdon
fonte
1
O catarquivo realmente tem alguma vantagem em acrescentar apenas? Parece que levaria mais tempo, pois ele precisa dividir dois processos a cada loop e também mover todo o conteúdo várias vezes.
123
1
@ 123 velocidade. A catabordagem é muito, muito mais rápida. Só faz sentido criar arquivos enormes, mas isso criou um arquivo de 545M em 10 segundos na minha máquina. O mesmo whileloop echo "test line" >> filecriou um arquivo de 96K na mesma quantidade de tempo.
terdon
Eu acho que a coisa com a abordagem "gato" é que ela cresce exponencialmente. Ao iniciar a segunda iteração, 'newfile' já possui 1 linha e 'file' possui 2 e, quando concluído, 'newfile' agora possui 3 linhas e 'file' é 5. Em seguida, 'newfile' será 8 e ' arquivo 'será 13. Próximo (21, 34) etc.
PypeBros 18/07
desvantagem: pode levar mais espaço em disco (> = 1,5 * tamanho_ desejado) do que o tamanho do arquivo de destino enquanto ele está sendo criado.
PypeBros 18/07
btw. Se você tiver truncate, você pode truncate -s 1Gcriar o arquivo em primeiro lugar. unix.stackexchange.com/a/269184/85549 . Você pode substituí-lo por um head -c $DESIRED_SIZE, possivelmente dentro do whileloop.
PypeBros 18/07
3

Ao canalizar o conteúdo de /dev/urandompara headvocê pode redirecionar a saída para um arquivo, portanto:

 cat /dev/urandom | head --bytes=100 >> foo.bar

Fornecerá um arquivo com 100 bytes de lixo.

gastador
fonte
1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

mesmo efeito do script do Windows, mas no bash, você não pode concatenar um arquivo diretamente para si mesmo.

MelBurslan
fonte
Além de esquecer a .txtextensão, você está deixando 2 arquivos grandes no final.
ott--