Para fins de teste, tenho que gerar um arquivo de um determinado tamanho (para testar um limite de upload).
O que é um comando para criar um arquivo de um determinado tamanho no Linux?
Para fins de teste, tenho que gerar um arquivo de um determinado tamanho (para testar um limite de upload).
O que é um comando para criar um arquivo de um determinado tamanho no Linux?
Respostas:
dd if=/dev/zero of=upload_test bs=file_size count=1
Onde file_size
está o tamanho do seu arquivo de teste em bytes
dd
tem um limite de 2 ^ 32 para os seus valores, de modo a criar um arquivo maior do que 4 GB, há um truque: dd if=/dev/zero of=test bs=1M count=<size in megabytes>
.
Por favor, moderno é mais fácil e mais rápido. No Linux, (escolha uma)
truncate -s 10G foo
fallocate -l 5G bar
É necessário declarar que truncate
em um sistema de arquivos que suporta arquivos esparsos criará um arquivo esparso e fallocate
não. Um arquivo esparso é aquele em que as unidades de alocação que compõem o arquivo não são realmente alocadas até serem usadas. Os metadados para o arquivo , no entanto, ocupam um espaço considerável, mas provavelmente nem perto do tamanho real do arquivo. Você deve consultar recursos sobre arquivos esparsos para obter mais informações, pois há vantagens e desvantagens nesse tipo de arquivo. Um arquivo não esparso tem seus blocos (unidades de alocação) alocados antecipadamente, o que significa que o espaço é reservado na medida em que o sistema de arquivos o vê. Além disso fallocate
, nem truncate
não irá definir o conteúdo do arquivo para um valor especificado como dd
, em vez disso, o conteúdo de um arquivo alocado com fallocate
ou truncate
pode ser qualquer valor do lixo que existia nas unidades alocadas durante a criação e esse comportamento pode ou não ser desejado. O dd
é o mais lento porque, na verdade, ele grava o valor ou a parte dos dados em todo o fluxo de arquivos, conforme especificado nas opções da linha de comando.
Esse comportamento pode ser potencialmente diferente - dependendo do sistema de arquivos usado e da conformidade desse sistema de arquivos com qualquer padrão ou especificação. Portanto, é recomendável que a pesquisa apropriada seja feita para garantir que o método apropriado seja usado.
truncate
. Produziu um arquivo de tamanho zero usando a sintaxe acima. A 'página de manual' de fallocate
diz que os arquivos que ele cria estão cheios de space
dados em vez de vazios . Parece que não seria útil para alguns casos esperados, como "quanto tempo leva para copiar um arquivo 1G".
brew install coreutils
. Isto irá adicionar um g na frente do comando, então você tem que executá-lo como este: gtruncate -s 10G foo
. Espero que isto ajude!
NTFS
partição.
Apenas para acompanhar a publicação de Tom , você pode usar o dd para criar arquivos esparsos:
dd if=/dev/zero of=the_file bs=1 count=0 seek=12345
Isso criará um arquivo com um "buraco" na maioria dos unixes - os dados não serão gravados no disco ou ocuparão espaço até que algo diferente de zero seja gravado nele.
count=0
, bs * seek
torna-se o tamanho do arquivo
No OSX (e Solaris, aparentemente), o mkfile
comando também está disponível:
mkfile 10g big_file
Isso cria um arquivo de 10 GB chamado "big_file". Encontrei essa abordagem aqui.
truncate
e fallocate
não estão disponíveis. dd
também funciona como descrito acima, embora seja m
para megabytes, não M
.
Use este comando:
dd se = $ INPUT-FILE de = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS
Para criar um arquivo grande (vazio), defina $INPUT-FILE=/dev/zero
.
O tamanho total do arquivo será $BLOCK-SIZE * $NUM-BLOCKS
.
O novo arquivo criado será $OUTPUT-FILE
.
Você pode fazer isso programaticamente:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main() {
int fd = creat("/tmp/foo.txt", 0644);
ftruncate(fd, SIZE_IN_BYTES);
close(fd);
return 0;
}
Essa abordagem é especialmente útil para subsequentemente mapear o arquivo na memória.
use o seguinte comando para verificar se o arquivo tem o tamanho correto:
# du -B1 --apparent-size /tmp/foo.txt
Seja cuidadoso:
# du /tmp/foo.txt
provavelmente imprimirá 0 porque está alocado como arquivo esparso se suportado pelo seu sistema de arquivos.
veja também: man 2 open e man 2 truncate
Algumas dessas respostas você usa /dev/zero
para a fonte dos seus dados. Se o seu teste de upload de rede acelerar, essa pode não ser a melhor ideia se o seu aplicativo estiver fazendo uma compactação, um arquivo cheio de zeros será compactado muito bem. Usando este comando para gerar o arquivo
dd if=/dev/zero of=upload_test bs=10000 count=1
Eu poderia comprimir upload_test
até 200 bytes. Assim, você pode se colocar em uma situação em que acha que está enviando um arquivo de 10 KB, mas na verdade seria muito menor.
O que eu sugiro é usar em /dev/urandom
vez de /dev/zero
. Não consegui comprimir muito a saída /dev/urandom
.
/dev/zero
, então /dev/urandom
é bom.
dd if=/dev/zero of=my_file.txt count=12345
Existem muitas respostas, mas nenhuma explicou bem o que mais pode ser feito. Examinando as páginas de manual do dd , é possível especificar melhor o tamanho de um arquivo.
Isso criará o /tmp/zero_big_data_file.bin preenchido com zeros, com tamanho de 20 megabytes:
dd if=/dev/zero of=/tmp/zero_big_data_file.bin bs=1M count=20
Isso criará /tmp/zero_1000bytes_data_file.bin preenchido com zeros, com tamanho de 1000 bytes:
dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin bs=1kB count=1
ou
dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin bs=1000 count=1
Como comando shell:
< /dev/zero head -c 1048576 > output
Usar fallocate
se você não quiser esperar pelo disco.
Exemplo:
fallocate -l 100G BigFile
Uso:
Usage:
fallocate [options] <filename>
Preallocate space to, or deallocate space from a file.
Options:
-c, --collapse-range remove a range from the file
-d, --dig-holes detect zeroes and replace with holes
-i, --insert-range insert a hole at range, shifting existing data
-l, --length <num> length for range operations, in bytes
-n, --keep-size maintain the apparent size of the file
-o, --offset <num> offset for range operations, in bytes
-p, --punch-hole replace a range with a hole (implies -n)
-z, --zero-range zero and ensure allocation of a range
-x, --posix use posix_fallocate(3) instead of fallocate(2)
-v, --verbose verbose mode
-h, --help display this help
-V, --version display version