linux - para - mp3tag ubuntu
Truncando los primeros 100MB de un archivo en linux. (6)
Elimine todas las últimas 10000 líneas de un archivo.
sed -i 1, $ (($ (wc -l <ruta / a / archivo) -10000)) d ruta / a / archivo
Me refiero a ¿Cómo puedes concatenar dos archivos enormes con muy poco espacio libre en el disco?
Estoy en medio de la implementación de lo siguiente:
- Asigne un archivo disperso del tamaño combinado.
- Copie 100Mb desde el final del segundo archivo hasta el final del nuevo archivo.
- Truncar 100Mb del final del segundo archivo
- Recorra 2 y 3 hasta que termine el segundo archivo (con 2. modificado en el lugar correcto en el archivo de destino).
- Haz 2 y 3 y 4 pero con el primer archivo.
Me gustaría saber si hay alguien allí que pueda "truncar" un archivo dado en Linux. El truncamiento es por tamaño de archivo, por ejemplo, si el archivo es de 10 GB, me gustaría truncar los primeros 100 MB del archivo y dejar el archivo con los 9,9 GB restantes. ¿Alguien podría ayudar en esto?
Gracias
Esta es una pregunta bastante antigua por ahora, pero aquí está mi opinión. Excluyendo el requisito de que se realice con un espacio limitado disponible, usaría algo similar a lo siguiente para truncar los primeros 100 MB de un archivo:
$ tail --bytes=$(expr $(wc -c < logfile.log) - 104857600) logfile.log > logfile.log.tmp
$ mv logfile.log.tmp logfile.log
Explicación:
- Esto genera los últimos nn bytes del archivo (cola - bytes).
- El número de bytes en el archivo a generar se calcula como el tamaño del archivo (wc -c <logfile.log) menos 100Mb (expr $ (...) - 104857600). Esto nos dejaría con 100Mb menos que el tamaño del archivo para tomar la cola (por ejemplo, 9.9Gb)
- Esto luego se envía a un archivo temporal y luego se regresa al nombre del archivo original para dejar el archivo truncado.
Lea un buen libro de programación de Linux, por ejemplo, Programación avanzada de Linux .
Necesita usar syscalls kernel de Linux , vea syscalls(2)
En particular, truncate(2) (tanto para el truncamiento como para extender un archivo disperso en los sistemas de archivos que lo soportan), y stat(2) para obtener el tamaño del archivo.
No hay una forma (portátil o de sistema de archivos neutral) de eliminar bytes desde el inicio (o en el medio) de un archivo, puede truncar un archivo solo al final.
No es posible cortar el inicio de un archivo con la mayoría de los sistemas de archivos y no hay una API general para hacerlo; por ejemplo, la función truncar solo modifica el final de un archivo.
Aunque puedes hacerlo con algunos sistemas de archivos. Por ejemplo, el sistema de archivos ext4 recientemente obtuvo un ioctl que puede ser útil: http://lwn.net/Articles/556136/
Actualización: Aproximadamente un año después de que se escribiera esta respuesta, se agregó a la función de http://man7.org/linux/man-pages/man2/fallocate.2.html el soporte para eliminar bloques del principio y de la mitad de los archivos en los sistemas de archivos ext4 y xfs, mediante el modo FALLOC_FL_COLLAPSE_RANGE
. Es más conveniente que usar el iotcl de bajo nivel usted mismo.
También hay una utilidad de línea de comandos con el mismo nombre que la función C. Suponiendo que su archivo está en un sistema de archivos compatible, esto eliminará los primeros 100 MB:
fallocate -c -o 0 -l 100MB yourfile
Respuesta, ahora esto es realidad con el kernel de Linux v3.15 (ext4 / xfs)
Lea aquí http://man7.org/linux/man-pages/man2/fallocate.2.html
Código de prueba
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#ifndef FALLOC_FL_COLLAPSE_RANGE
#define FALLOC_FL_COLLAPSE_RANGE 0x08
#endif
int main(int argc, const char * argv[])
{
int ret;
char * page = malloc(4096);
int fd = open("test.txt", O_CREAT | O_TRUNC | O_RDWR, 0644);
if (fd == -1) {
free(page);
return (-1);
}
// Page A
printf("Write page A/n");
memset(page, ''A'', 4096);
write(fd, page, 4096);
// Page B
printf("Write page B/n");
memset(page, ''B'', 4096);
write(fd, page, 4096);
// Remove page A
ret = fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, 0, 4096);
printf("Page A should be removed, ret = %d/n", ret);
close(fd);
free(page);
return (0);
}
Si puede trabajar con líneas ASCII y no con bytes, eliminar las primeras n líneas de un archivo es fácil. Por ejemplo, para eliminar las primeras 100 líneas:
sed -i 1,100d /path/to/file