Me refiero a ¿Cómo se puede concatenar dos archivos de gran tamaño con muy poco espacio de disco libre?

Estoy en el medio de la implementación de los siguientes:

  1. Asignar un archivo disperso de la combinación de tamaño.
  2. Copia de 100Mb desde el final de la segunda archivo al final del archivo nuevo.
  3. Truncar 100Mb de la final de la segunda archivo
  4. Bucle 2&3 hasta que termine el segundo archivo (Con 2. modificado en el lugar correcto en el archivo de destino).
  5. Hacer 2&3&4 pero con el primer archivo.

Me gustaría saber si hay alguien ahí, que son capaces de «truncar» un archivo en linux? El truncamiento es por el tamaño del 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 el resto de 9.9 GB. Alguien podría ayudar en esto?

Gracias

InformationsquelleAutor CheeHow | 2013-08-06

6 Comentarios

  1. 19

    Respuesta, ahora esta es la realidad con el kernel de Linux v3.15 (ext4/xfs)

    Leer 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);
    }
    
    • GNU_SOURCE_ debe ser definido antes de la inclusión de fcntl.h – al menos en Ubuntu 16.04. Sólo entonces fallocate y FALLOC_FL_COLLAPSE_RANGE están disponibles como gnu-específicos (experimental) características.
    • genial!!! pero ¿cómo hago uso de bash ? supongamos que no quiero compilar código c
    • En el shell, puede utilizar man 1 fallocate. Como este: fallocate -c -o offset -l length filename. Usted necesita apt install util-linux (como la de Ubuntu 18.04).
  2. 7

    Cortando el comienzo de un archivo, no es posible con la mayoría de sistemas de archivos y no hay ningún general de la API para hacerlo; por ejemplo, la función truncar sólo modifica el final de un archivo.

    Usted puede ser capaz de hacerlo con algunos sistemas de archivos, aunque. Por ejemplo, el sistema de archivos ext4 recientemente consiguió un ioctl que usted puede encontrar útil: http://lwn.net/Articles/556136/


    Actualización: Alrededor de un año después de esta respuesta fue escrito, el apoyo para la eliminación de los bloques de principio y mediados de los archivos en ext4 y xfs sistemas de archivos se añaden a la fallocate función, por el camino de la FALLOC_FL_COLLAPSE_RANGE modo. Es más conveniente que el uso de el bajo nivel iotcl del mismo.

    También hay un utilidad de línea de comandos con el mismo nombre que la función C. Suponiendo que el archivo está en un sistema de archivos, esto borrará la primera 100MB:

    fallocate -c -o 0 -l 100MB yourfile
    
    • El OP menciona truncar al final del archivo en la pregunta del cuerpo
    • Sí, y también el principio.
    • aunque no hay una clara solución, lo que está en mi mente ahora es sólo para hacer uso de truncate comando para truncar manualmente el archivo de la cola, consiguiendo que el tamaño del archivo de restar al 100 MB. Gracias por la sugerencia, aunque…
  3. 3

    Por favor, leer un buen Linux libro de programación, por ejemplo,Avanzados De Programación Para Linux.

    Necesita utilizar El kernel de Linux syscalls, ver syscalls(2)

    En particular, truncar(2) (tanto para el truncamiento, y por extensión de un archivo disperso en sistemas de archivo de apoyo), y stat(2) notablemente obtener el tamaño de archivo.

    No hay ninguna (portátil, o el sistema de archivos neutro) de manera de eliminar los bytes desde el inicio (o en el medio) de un archivo, usted puede truncar un archivo único en su extremo.

    • sí, eso es exactamente lo que mi problema es. De todos modos, que yo sepa, se trunca en linux sólo truncar a un tamaño de archivo fijo. por ejemplo, si desea que su archivo de tamaño de 4 KB, sólo tiene que hacer truncate -s 4k filename.txt. Lo que yo quiero es tener mi archivo de reducir su cabeza o de la cola por 100MB. Es lo que se puede conseguir?
  4. 2

    Si usted puede trabajar con líneas en ASCII y no en bytes, a continuación, la eliminación de las primeras n líneas de un archivo es fácil. Por ejemplo, para quitar las 100 primeras líneas:

    sed -i 1,100d /path/to/file
    
    • líneas diferentes de tamaño.
  5. 1

    Esta es una muy vieja pregunta por ahora, pero aquí está mi opinión sobre ella. Excluyendo el requisito para que se haga con limitado espacio disponible, me gustaría usar algo similar a la 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:

    • Esta salida es el último nn bytes del archivo (cola –bytes).
    • El número de bytes en el archivo de salida se calcula como el tamaño del archivo (wc -c < logfile.de registro) menos de 100 mb (expr $( … ) – 104857600). Esto nos dejaría con 100 mb menos que el tamaño del archivo a tomar la cola de (por ejemplo. 9.9 Gb)
    • Esto es, la salida a un archivo temporal y, a continuación, volver a mover el nombre del archivo original para dejar el archivo truncado.
  6. -1

    quitar todos, pero la última 10000 líneas de un archivo

    sed-i 1,$(($(wc -l < ruta/a/archivo) -10000))d ruta/a/archivo

    • la pregunta se basa en el tamaño del archivo, no la cantidad de líneas de

Dejar respuesta

Please enter your comment!
Please enter your name here