Como criar um arquivo grande no UNIX?

15

Eu encontrei uma maneira no Windows para fazer tal coisa

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

link

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

    
por Thomas Lee 11.03.2016 / 15:52

7 respostas

28
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, veja 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 muitos bytes zero ".

Fazer cat file >> file seria uma má ideia.

Primeiro, ele não funciona com algumas implementações de cat que se recusam a ler arquivos que são o mesmo que o arquivo de saída. Mas, mesmo se você contornar isso fazendo cat file | cat >> file , se file for maior que o buffer interno de cat , isso fará com que cat seja executado 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 seria armazenado em cache na memória), pois a unidade precisaria ir e voltar entre o local onde ler os dados, e que onde escrevê-lo.

    
por 11.03.2016 / 16:07
20

Você pode criar um arquivo grande no Solaris usando:

mkfile 10g /path/to/file

Outra maneira de trabalhar no Solaris (e no Linux):

truncate -s 10g /path/to file

Também é possível usar:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
    
por 11.03.2016 / 16:10
6

Isso continuará até você CTRL-C:

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

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

De man yes :

yes - output a string repeatedly until killed
    
por 11.03.2016 / 16:08
5

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

sudo fallocate -l 2G bigfile

fallocate manipula 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 ele precisa ser executado como root.

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

De man fallocate

fallocate is used to manipulate the allocated disk space for a file, either to deallocate or preallocate it.
For filesystems which support the fallocate system call, preallocation is done quickly by allocating blocks and marking them as uninitialized, requiring no IO to the data blocks. This is much faster than creating a file by filling it with zeros.
Supported for XFS (since Linux 2.6.38), ext4 (since Linux 3.0), Btrfs (since Linux 3.7) and tmpfs (since Linux 3.5).

    
por 11.03.2016 / 19:04
4

Se eu entendi corretamente, 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 de "linha de teste". Se você quiser um tamanho de arquivo específico, você 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, eu uso dois arquivos e um gato no outro. Você pode repetir o processo até atingir o tamanho desejado (1MB 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á inserido novamente.

Finalmente, se tudo o que você quer é um arquivo do tamanho desejado e não precisa dele para realmente conter nada, você pode usar truncate :

truncate -s 1M file
    
por 11.03.2016 / 16:09
3

Por canalizar o conteúdo de /dev/urandom para head você pode redirecionar a saída para um arquivo, então:

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

Irá dar-lhe um ficheiro com 100 bytes de lixo.

    
por 12.03.2016 / 14:29
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 seu script do Windows, mas no bash, você não pode concatenar um arquivo para si mesmo, diretamente.

    
por 11.03.2016 / 15:59

Tags