GNU/Linux >> Linux Esercitazione >  >> Linux

Come rimuovere X byte dalla fine di un file di grandi dimensioni senza leggere l'intero file?

usa la funzione truncate

http://linux.die.net/man/2/truncate

int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length); 

truncate prende il nome del file
ftruncate accetta un descrittore di file aperto

entrambi impostano la lunghezza del file su length quindi tronca o allunga (in quest'ultimo caso, il resto del file sarà riempito con NULL/ZERO)

[modifica]
funzionerà anche truncate (comando shell linux).

**SYNTAX**

truncate -s integer <filename>  
**OPTIONS**

-s number specify the new file length. If the new length is smaller than the current filelength data is lost. If the new length is greater the file is padded with 0. You can specify a magnitude character to ease large numbers:
b or B size is bytes.
k size is 1000 bytes.
K size is 1024 bytes.
m size is 10^6 bytes.
M size is 1024^2 bytes.
g size is 10^9 bytes.
G size is 1024^3 bytes.


**EXAMPLES**

To shrink a file to 10 bytes:

truncate -s 10 /tmp/foo

To enlarge or shrink a file to 345 Megabytes:

truncate -s 345M /tmp/foo

[/modifica]


Sebbene ci fossero molti riferimenti al truncate funzione in questo thread, nessuno ha davvero risposto alla domanda dell'OP sulla riduzione di un file di un importo fisso da un ambiente di scripting. La risposta di Kevin utilizzava truncate per ridimensionare il file di destinazione a un importo fisso, ma ovviamente la correttezza di questa soluzione richiede che l'utente conosca prima la dimensione del file di destinazione meno i dati estranei alla fine. Quindi, abbiamo:

   -s, --size=SIZE
          set or adjust the file size by SIZE bytes

Truncate in realtà supporta la rimozione dei dati dalla fine di un file di destinazione direttamente anteponendo a SIZE un - carattere.

Ad esempio, per ridimensionare un file di 314 byte puoi fare:

truncate --size=-314 target_file.bin


Usare "truncate" è il modo migliore, inserisco solo alcuni esempi:

  1. Ho un file "PNav-h.db", ha 50176 byte.

    -rw-r--r--  1 user user 50176 Mar  8 23:43 PNav-h.db
     $truncate -s 1000 PNav-h.db
    

    imposta la dimensione del file a 1000 byte

     -rw-r--r--  1 user user  1000 Mar  9 00:02 PNav-h.db
    
  2. Nel tuo caso, usa $truncate --size=xxx xxfilename , utilizzando -<size number> per ridurre le dimensioni del file

    $truncate --size=-300 PNav-h.db
    -rw-r--r--  1 user user   700 Mar  9 00:07 PNav-h.db
    

    dimensione finale del file =1000-300=700

  3. utilizzando +<size number> per aumentare la dimensione del file

    $truncate --size=+500 PNav-h.db
    -rw-r--r--  1 user user  1200 Mar  9 00:09 PNav-h.db
    

    dimensione finale del file =700 + 500 =1200

  4. se non c'è - o + , serve per impostare la dimensione del file.

    $truncate --size=60000 PNav-h.db
    -rw-r--r--  1 user user 60000 Mar  9 00:12 PNav-h.db 
    

    dimensione finale del file impostata su 60000


Linux
  1. Come aggiungere una nuova riga alla fine di un file?

  2. Come estraggo un singolo pezzo di byte dall'interno di un file?

  3. Come rimuovere le linee che appaiono sul file B da un altro file A?

  4. Come rimuovo il dispositivo cache da bcache?

  5. Script Bash per rimuovere il file più vecchio da una cartella

Come rimuovere la password da un file PDF in Linux

Come rimuovere (^M) caratteri da un file in Linux

Come visualizzare le dimensioni/i dettagli del file dal comando ls in Unix

Come rimuovo le nuove righe da un file di testo?

Come ottenere la dimensione di tar.gz nel file (MB) in python

Come estrarre il testo da un file di grandi dimensioni, a partire dalla prima occorrenza di una stringa?