¿Cómo puedo crear un archivo con un tamaño específico desde una línea de comando?

125

¿Cómo puedo crear un archivo (por ejemplo, usando el touchcomando u otra forma similar), pero con un tamaño específico (por ejemplo, 14 MB)?

El caso de uso es probar FTP con varios tamaños de archivo. Si podemos crear un archivo con un tamaño específico, será útil verificar la transferencia FTP, etc.

fasil
fuente
99
Pregunta SO relacionada: stackoverflow.com/questions/257844/…
Der Hochstapler

Respuestas:

158

Uso 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: es truncateposible que no esté disponible en su sistema, por ejemplo, en Mac OS X no está instalado de manera predeterminada (pero puede instalarlo fácilmente, por ejemplo, utilizando macports). En estos casos, es posible que necesite usar ddo en su headlugar.

Ashutosh Vishwa Bandhu
fuente
2
Guau. Muy bien, no sabía esto.
n611x007
El hombre lo dice todo: truncar - reducir o ampliar el tamaño de un archivo al tamaño especificado
ssedano
12
Muy bueno de verdad. Sin touchembargo, no es necesario, simplemente puede ejecutarlo truncate -s 14M filenamey creará filenamedirectamente.
terdon
genial ... esto es exactamente lo que buscaba ... gracias @ oliver-salzburg
fasil
34
Esto parece crear un archivo disperso , mientras que la respuesta a continuación (que usa "dd") no lo hace. No sé si la diferencia es importante para ti, pero pensé que lo señalaría
offby1
100

EDITAR: La forma más simple es probablemente la respuestatruncate de Ashutosh Vishwa Bandhu , pero como lo señaló @ offby1 que crea archivos dispersos que pueden no ser lo que desea. Las siguientes soluciones crean archivos normales y completos.


Los siguientes comandos crean un archivo de 14MB llamado foo:

  1. fallocate(Gracias a @Breakthrough que lo sugirió en los comentarios y vota la respuesta de Ahmed Masud a continuación, que también lo menciona).

    fallocate -l 14000000 foo
    

    Este comando es particularmente impresionante ya que es tan rápido como truncate(instantáneo) independientemente del tamaño de archivo deseado (a diferencia de las otras soluciones que serán lentas para archivos grandes) y, sin embargo, crea archivos normales, no dispersos:

    $ 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. Crea un archivo lleno de datos aleatorios

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

                                                                              o

    head -c 14MB /dev/urandom > foo
    
  3. Crea un archivo lleno de \0s:

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

                                                                              o

    head -c 14MB /dev/zero > foo
    
  4. Cree un archivo lleno con los primeros 14 MB de datos de otro archivo:

    head -c 14MB bar.txt > foo
    
  5. Cree un archivo lleno con los últimos 14 MB de datos de otro archivo:

    tail -c 14MB bar.txt > foo
    

En todos los ejemplos anteriores, el archivo será, 14*1000*1000si lo desea 14*1024*1024, reemplazar MBcon M. Por ejemplo:

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

fallocate solo ofertas en bytes, por lo que tendría que hacer (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo
terdon
fuente
2
Gracias ... Esto también cumplirá mi propósito de crear un archivo del tamaño deseado ...
fasil
2
Recomendaría no utilizar ddsi existe un enfoque más simple y menos potencialmente destructivo.
acólito
3
@acolyte yo también. Es por eso que cada ddsolución tiene una alternativa no dd.
terdon
1
La entrada de la wiki dice que incluso dd (con ceros) creará un archivo disperso, ¿no? en.wikipedia.org/wiki/Sparse_file
Michael
1
@Michael Lo comprobé, solo para asegurarme, y ninguno de mis comandos produce archivos dispersos. El ddcomando en la página wiki es completamente diferente y no se usa /dev/zero. En cuanto a si Mo MBes más lógico, tomar con los desarrolladores. Las páginas de manual de head , tail y dd indican claramente que "MB = 1000 * 1000, M = 1024 * 1024". Esto puede ser diferente en otros * nixes.
terdon
21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

ADVERTENCIA dd sobrescribirá en silencio todo lo que tiene derecho a escribir, si lo especifica de forma voluntaria o accidental. Asegúrese de entender dd, por ejemplo. con la lectura dd --help, y no arruinas tus líneas de comando dd o de lo contrario puedes crear fácilmente una pérdida de datos irreversible, incluso total .

Para empezar, if=es el archivo de entrada y of=es el archivo de salida . Siempre verifique que haya acertado antes de ejecutar el comando. :)

n611x007
fuente
13

Use magic dd;) página de manual

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

causa 14 MB * 1024 = 14336 KB, o:

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

Y obtendrá un archivo output.dat de 14mb, lleno de ceros: D

mirkobrankovic
fuente
8

Esta debería ser la forma más rápida de hacerlo:

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

De lo contrario, simplemente escriba un programa C o perl rápido y sucio que busque la posición exacta y escriba un solo byte. Esto es MUCHO más rápido que descargar datos en los bloques.

Si se quiere evitar archivos dispersos a continuación en Linux (y posiblemente otros sistemas) puede utilizar fallocate -l <length>a partir util-linux.

Si eso no está disponible, y tiene un sistema compatible con POSIX, puede escribir un programa rápido y sucio utilizando la llamada a la biblioteca posix_fallocate (). posix_fallocate garantiza la asignación del rango especificado, por lo que no obtendrá un disco lleno en el uso posterior del rango si regresa con éxito

Ahmed Masud
fuente
6

Si bien ddes la forma portátil de hacerlo, los comandos mkfiley xfs_mkfileestán escritos específicamente para este propósito y son más rápidos:

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

El problema es que ninguno de los comandos está disponible universalmente, por lo que no son buenos para escribir scripts portátiles. Sin embargo, si lo estoy haciendo interactivamente a través de la línea de comandos, esos son los comandos que uso.

De manera predeterminada, crean archivos con relleno cero y no archivos dispersos (o "holey") . Ambos toman la -nopción de crear archivos dispersos en su lugar.

Viejo pro
fuente
1

Hay otra opción con Perl:

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

Esto creará un archivo de 1 KB. Reemplace 1024 con cualquier número que desee.

Majid Azimi
fuente