Como posso criar um arquivo com um tamanho específico em uma linha de comando?

125

Como posso criar um arquivo (por exemplo, usando o touchcomando ou outra maneira 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 conseguirmos criar um arquivo com um tamanho específico, será útil verificar a transferência FTP etc.

fasil
fonte
9
Pergunta relacionada ao SO: stackoverflow.com/questions/257844/…
Der Hochstapler

Respostas:

158

Use truncate:

truncate -s 14M filename

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: truncatepode não estar disponível no seu sistema, por exemplo, no Mac OS X, ele não está instalado por padrão (mas você pode instalá-lo facilmente, usando macports, por exemplo). Nesses casos, você pode precisar usar ddou headsubstituir.

Ashutosh Vishwa Bandhu
fonte
2
Uau. muito legal, eu não sabia disso.
N611x007
homem diz tudo: truncar - encolher ou ampliar o tamanho de um arquivo para o tamanho especificado
ssedano
12
Muito bom mesmo. O touchnão é necessário, porém, você pode simplesmente executá- truncate -s 14M filenamelo e criar filenamediretamente.
terdon
legal ... é isso que eu exatamente olhou para ... obrigado @ oliver-Salzburg
fasil
34
Isso parece criar um arquivo esparso , enquanto a resposta abaixo (que usa "dd") não. Eu não sei se a diferença for importante para você, mas eu achei que iria indicá-lo
offby1
100

EDIT: A maneira mais simples é provavelmente a respostatruncate de Ashutosh Vishwa Bandhu , mas como apontado por @ offby1, que cria arquivos esparsos que podem não ser o que você deseja. As soluções abaixo criam arquivos completos normais.


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

  1. fallocate(obrigado a @Breakthrough, que sugeriu isso nos comentários e vote na resposta de Ahmed Masud abaixo, que também a menciona.)

    fallocate -l 14000000 foo
    

    Este comando é particularmente impressionante, pois é tão rápido quanto truncate(instantâneo), independentemente do tamanho do arquivo desejado (diferente das outras soluções que serão lentas para arquivos grandes) e ainda cria arquivos normais, e 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 14 MB de dados de outro arquivo:

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

    tail -c 14MB bar.txt > foo
    

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

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

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

fallocate -l 14680064 foo
Terdon
fonte
2
Obrigado ... Isso também irá cumprir o meu propósito de criar um arquivo de tamanho desejado ...
fasil
2
eu recomendaria contra o uso de ddse houver uma abordagem mais simples e menos potencialmente destrutiva.
Acoleta
3
@acolyte eu também. É por isso que cada ddsolução tem uma alternativa não dd.
terdon
1
A entrada do wiki diz que mesmo o dd (com zeros) criará um arquivo esparso, não é? en.wikipedia.org/wiki/Sparse_file
Michael
1
@ Michael Verifiquei, só para ter certeza, e nenhum dos meus comandos produz arquivos esparsos. O ddcomando na página wiki é completamente diferente e não é usado /dev/zero. Quanto a saber se é Mou MBnão mais lógico, aceite os desenvolvedores. As páginas de manual de cabeça , cauda e dd indicam claramente que "MB = 1000 * 1000, M = 1024 * 1024". Isso pode ser diferente em outros * nixes.
terdon
21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

O WARNING dd substituirá silenciosamente qualquer coisa para a qual você tenha o direito de gravar, se você especificar voluntariamente ou por acidente. Certifique-se de entender dd, por exemplo. com a leitura dd --helpe você não estraga suas linhas de comando dd, ou pode facilmente criar perda irreversível de dados - mesmo total .

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

n611x007
fonte
13

Página de manual Use magic dd;)

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

causar 14 MB * 1024 = 14336 KB, ou:

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

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

mirkobrankovic
fonte
8

Essa 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 procura a posição exata e grava um único byte. Isso é muito mais rápido do que realmente despejar dados nos blocos.

Se você quer evitar arquivos esparsos, em seguida, no Linux (e possivelmente outros sistemas), você pode usar fallocate -l <length>a partir 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 de biblioteca posix_fallocate (). posix_fallocate garante a alocação do intervalo especificado, para que você não fique com um disco cheio no uso subsequente do intervalo se ele retornar com êxito

Ahmed Masud
fonte
6

Embora ddseja a maneira portátil de fazer isso, os comandos mkfilee xfs_mkfilesão escritos especificamente para esse fim 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, portanto, eles não são bons para escrever scripts portáteis. No entanto, se eu estiver fazendo isso de forma interativa pela linha de comando, esses são os comandos que eu uso.

Por padrão, eles criam arquivos preenchidos com zero e não arquivos esparsos (ou "holey") . Ambos têm a -nopção de criar arquivos esparsos.

Old Pro
fonte
1

Há outra opção no Perl:

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

Isso criará um arquivo de 1 KB. Substitua 1024 pelo número que desejar.

Majid Azimi
fonte