Tengo un archivo xml de 150 GB que me gustaría acortar (es decir, truncar) a aproximadamente 1 GB: ¿puedo usar un comando simple (bash o similar) o debo seguir la ruta programática (editándolo en vi o emacs es una pesadilla incluso en grandes sistemas de hierro)?
(No estoy particularmente preocupado por la pérdida de información, quiero un archivo más corto para poder probar una pieza de software al respecto y no esperar muchas horas por la respuesta, un archivo más corto me permitirá hacerlo).
bash
unix
file-management
adrianmcmenamin
fuente
fuente
Respuestas:
Suponiendo que desea truncar y extraer el primer 1 GB del archivo de 150 GB:
Con
head
:head -c 1G infile > outfile
Tenga en cuenta que el
G
sufijo puede reemplazarseGB
para alinearse con 1000 en lugar de 1024.O con
dd
:dd if=infile of=outfile bs=1M count=1024
O como en Wumpus Q. La respuesta de Wumbley,
dd
puede truncarse en su lugar.fuente
Para truncar un archivo a 1 gigabyte, use el
truncate
comando:El resultado del truncamiento probablemente no será un archivo XML válido, pero supongo que lo comprende.
La documentación para la versión GNU de
truncate
está aquí y la documentación para la versión BSD está aquífuente
Siempre que sea posible, usaría el
truncate
comando como en la respuesta de John1024. Sin embargo, no es un comando estándar de Unix, por lo que es posible que algún día no puedas usarlo. En ese caso, tambiéndd
puede hacer un truncamiento en el lugar.dd
El comportamiento predeterminado es truncar el archivo de salida en el punto donde finaliza la copia, por lo que solo debe darle un archivo de entrada de longitud 0 y decirle que comience a escribir en el punto de truncamiento deseado:(Esto no es lo mismo que copiar y truncar
dd
en la respuesta de multithr3at3d).Tenga en cuenta que usé 1048576 y 1024 porque 1048576 * 1024 es el tamaño deseado. Evité bs = 1m porque se trata de una respuesta "portabilidad", y clásicos
dd
sólo sabe sufijosk
,b
yw
.fuente
bs
número multiplicado por elseek
número es el número de bytes que se deben mantener. Cualquier dos números que satisfagan esa restricción deberían funcionar; por ejemplo,bs=1073741824 seek=1
obs=1 seek=1073741824
. O, dado que el valorbs
predeterminado es 512,seek=2097152
solo también debería funcionar. Y puede utilizar la notación como1M
,1K
,1G
y2M
.No estoy completamente seguro de lo que estás preguntando. ¿Solo quiere deshacerse de los otros 149 GB o está tratando de comprimir 150 GB en 1 GB? Independientemente, este puede ser un método útil para lograr esto.
El
split
comando puede dividir cualquier archivo en varias partes. Ver hombre dividido . Puede especificar el tamaño de los fragmentos de archivo en los que desea dividirlo con la-b
opción. Por ejemplo:$ split -b 1GB myfile.xml
Sin ninguna otra opción, esto debería crear varios archivos en el directorio actual comenzando con la letra
x
. Si desea ajustar los nombres de los archivos divididos, consulte la página del manual.Para volver a ensamblar el archivo simplemente use
cat * > re-assembled.xml
.Ejemplo:
fuente
Puedes usar el
split
comando.Para más detalles, eche un vistazo a esta respuesta de stackoverflow
fuente
Al final solo solía
sed
extraer un número arbitrario de líneas:fuente
sed 1000000q
(y un poco más compacto, visualmente hablando).