Questão Como posso criar um arquivo com um tamanho específico a partir de uma linha de comando?


Como posso criar um arquivo (por exemplo, usando o touch comando ou outro modo semelhante), mas com um tamanho específico (por exemplo, 14 MB)?

O caso de uso é testar o FTP com vários tamanhos de arquivo. Se pudermos criar um arquivo com um tamanho específico, será útil verificar a transferência por FTP, etc.


114


origem


Perguntas SO relacionadas: stackoverflow.com/questions/257844/… - Der Hochstapler


Respostas:


Usar truncate:

truncate -s 14M filename

A partir de man truncate:

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

Nota: truncate pode não estar disponível em seu sistema, por exemplo no Mac OS X ele não é instalado por padrão (mas você pode instalá-lo facilmente, usando macports por exemplo). Nestes casos você pode precisar usar dd ou head em vez de.


148



Uau. muito bom, eu não sabia disso. - n611x007
man says it all: truncar - reduza ou estenda o tamanho de um arquivo para o tamanho especificado - ssedano
Muito bom mesmo. o touch não é necessário, você pode simplesmente executar truncate -s 14M filename vai criar filename diretamente. - terdon
legal ... isso é o que eu exatamente procurei ... obrigado @ oliver-salzburg - fasil
Isto parece criar um arquivo esparso, enquanto a resposta abaixo (que usa "dd") não. Eu não sei se a diferença é importante para você, mas achei que eu ia mostrar - offby1


EDIT: O caminho mais simples é provavelmente o truncate de Ashutosh Vishwa Bandhu responda, mas como apontado por @ offby1 isso cria arquivos esparsos que pode não ser o que você quer. As soluções abaixo criam arquivos normais e completos.


Os seguintes comandos criam um arquivo de 14MB chamado foo:

  1. fallocate (graças a @Breakthrough que sugeriu nos comentários e votar Ahmed Masud responda abaixo, que também menciona.)

    fallocate -l 14000000 foo
    

    Este comando é particularmente impressionante, pois é tão rápido quanto truncate (instantâneo), independentemente do tamanho de arquivo desejado (ao contrário das outras soluções, que serão lentas para arquivos grandes) e ainda criar arquivos normais, não esparsos:

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
    
  2. Crie um arquivo preenchido com dados aleatórios

    dd if=/dev/urandom of=foo bs=14MB count=1
    

    ou

    head -c 14MB /dev/urandom > foo
    
  3. Crie um arquivo preenchido com \0s:

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    

    ou

    head -c 14MB /dev/zero > foo
    
  4. Crie um arquivo preenchido com os primeiros 14MB de dados de outro arquivo:

    head -c 14MB bar.txt > foo
    
  5. Crie um arquivo preenchido com os últimos 14MB de dados de outro arquivo:

    tail -c 14MB bar.txt > foo
    

Em todos os exemplos acima, o arquivo será 14*1000*1000 se você quiser 14*1024*1024substitua MB com M. Por exemplo:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate apenas ofertas em bytes, então você teria que fazer (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo

95



Obrigado ... Isso também atenderá ao meu propósito de criar um arquivo de tamanho desejado ... - fasil
eu recomendaria contra o uso de dd se houver uma abordagem mais simples, menos potencialmente destrutiva. - acolyte
@acolyte assim faria I. É por isso que cada dd solução tem uma alternativa não-dd. - terdon
A entrada do wiki diz que mesmo o dd (com zeros) criará um arquivo esparso, não é? en.wikipedia.org/wiki/Sparse_file - Michael
@Michael eu verifiquei, só para ter certeza, e nenhum dos meus comandos produz arquivos esparsos. o dd comando na página wiki é completamente diferente e não usa /dev/zero. Quanto a se M ou MB é mais lógico, pegue-o com os desenvolvedores. As páginas do homem de cabeça, rabo e dd todos afirmam claramente que "MB = 1000 * 1000, M = 1024 * 1024". Isso pode ser diferente em outros * nixes. - terdon


dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

ATENÇÃO  dd irá sobrescrever silenciosamente qualquer coisa você tem o direito de escrever, se você especificá-lo de bom grado ou por acidente. Certifique-se de entender dd, por exemplo. com leitura dd --help, e você não estraga as linhas de comando do dd ou então você pode facilmente criar uma perda de dados irreversível - mesmo total.

Para começar, if= é o Arquivo de entrada e of= é o arquivo de saída. Sempre verifique novamente se você acertou, antes de executar o comando. :)


21





Use magia dd ;) página man

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

causa 14MB * 1024 = 14336KB ou:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

E você terá 14mb arquivo output.dat, preenchido com zeros: D


13





Esta deve ser a maneira mais rápida de fazer isso:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

Caso contrário, basta escrever um programa C ou perl rápido e sujo que procure a posição exata e grave um único byte. Isso é muito mais rápido do que despejar dados nos blocos.

Se você quiser evitar arquivos esparsos, então no Linux (e possivelmente em outros sistemas) você pode usar fallocate -l <length> a partir de util-linux.

Se não estiver disponível e você tiver um sistema compatível com POSIX, poderá escrever um programa rápido e sujo usando a chamada da biblioteca posix_fallocate (). posix_fallocate garante a alocação do intervalo especificado para que você não obtenha um disco cheio no uso subseqüente do intervalo se ele retornar com sucesso


8





Enquanto dd é a maneira portátil de fazer isso, os comandos mkfile e xfs_mkfile são escritos especificamente para este propósito e são mais rápidos:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

O problema é que nenhum dos comandos está disponível universalmente, então eles não são bons para escrever scripts portáveis. No entanto, se eu estiver fazendo isso interativamente através da linha de comando, esses são os comandos que eu uso.

Por padrão, crie arquivos não-holey preenchidos com zero. Ambos tomam o -n opção para criar arquivos holey em vez disso.


5





Existe outra opção com o Perl:

perl -e 'print "a" x 1024' > file.txt

Isso criará um arquivo de 1 KB. Substitua 1024 por qualquer número que você goste.


1