Tengo un archivo que quiero rellenar hasta que llegue a 16 MiB (16777216 bytes). Actualmente es 16515072 bytes. La diferencia es 262144 bytes.
¿Cómo lo relleno?
Esto no parece estar funcionando:
cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144
bs=1
endd
está en mi experiencia muy costosa en tiempo de ejecución.truncate -s 16M thefile
Respuestas:
Suelta
of=largerfile.txt
y agrega stdout al archivo:fuente
seek
Es una opción correcta aquí.Además de las respuestas para obtener un relleno físico, también puede dejar la mayor parte del espacio de relleno en el archivo simplemente vacío ("agujeros"),
seek
yendo a la nueva posición final del archivo y escribiendo un solo carácter:(que tiene la ventaja de ser mucho más eficiente, específicamente con
bs=1
, y no ocupa grandes cantidades de espacio en disco adicional).Ese método parece funcionar incluso sin agregar ningún carácter, mediante el uso
if=/dev/null
y el tamaño final deseado del archivo:Una variante eficaz de una solución de relleno físico que utiliza bloques de mayor tamaño es:
fuente
truncate -s +262144 largerfile.txt
también sería rápido.La mejor respuesta aquí es la de Janis (arriba) porque le permite olvidarse del tamaño del archivo actual y el pad directamente al tamaño deseado sin ningún cálculo.
También aprovecha los archivos dispersos, que no se agregan / dev / zero.
Sin embargo, la respuesta podría ser más ordenada, porque 'count' puede ser 0 y aún obtienes el relleno:
(Editar: esto es correcto para GNU dd, pero el comportamiento de
count=0
es específico de la plataforma, ver comentarios)fuente
count=0
no está especificado, pero normalmente es el mismo que cuando nocount
se especificó ningún parámetro. Más problemas:dd
trunca el archivo a 16777216 bytes, pero si tiene la esperanza de que esto cree un agujero al final, está equivocado ya que primero necesitaría escribir datos después del agujero y luego truncarlo a un tamaño que no contenga datos .dd if=/dev/zero of=somefile
es lo mismo quedd if=/dev/zero of=somefile count=0
? Intentalo.count=0
es lo mismo que si no especificaras un parámetro de conteo en absoluto. Esto es cierto al menos para todas las implementaciones que se han derivado de las fuentes originales. Pruébelo, parece que nunca trabajó con eldd
comando original .count
significar 'ignorar este parámetro'. ¿Puedes encontrar alguno? Sin dicha documentación,count=0
significa 'escribir cero bloques' y cualquier desviación de esto es un error ... (fuentes originales o no).¿Tienes que usar
dd
? Si desea que un archivo tenga una longitud (lógica) particular, simplemente escriba un cero en la posición que desea. Los bytes entre el final anterior y el byte escrito se mostrarán con bytes nulos. Aquí hay un ejemplo usando perl.¿Por qué el "- 2" en la línea? El script escribirá un byte, por lo que restamos 1 para buscar la posición anterior a ese byte. Despegamos el otro porque la posición de búsqueda está indexada a cero.
fuente