Come tagliare un file ad una determinata dimensione sotto Linux?


19

Voglio ridurre le dimensioni di un file con la forza bruta, cioè non mi interessa il resto, voglio solo tagliare il file, dire a metà e scartare il resto.

La prima cosa che mi viene in mente è il tronco di Perl . Sto seguendo l'esempio su quella pagina e ho fatto esattamente la stessa cosa:

seq 9 > test.txt
ls -l test.txt
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

Ma il file ha ancora le stesse dimensioni:

$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt

Come posso farlo funzionare?

Risposte:


62

Potresti voler usare il comando truncate :

truncate --size=1G test.txt

SIZE può essere specificato come byte, KB, K, MB, M, ecc. Suppongo che tu possa calcolare manualmente la dimensione desiderata; in caso contrario, è possibile utilizzare il comando stat per ottenere informazioni sulla dimensione corrente del file.


La sua documentazione (in formato informativo) da coreutils.
Cristian Ciupitu,

21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

apre il file per la lettura. Tuttavia, per troncare il file è necessario modificarlo, quindi un handle di file di sola lettura non funzionerà. È necessario utilizzare la modalità "modifica" ( "+>").

Come problema secondario, mi stupisce sempre quando le persone lasciano che le chiamate di sistema falliscano silenziosamente e poi chiedano cosa è andato storto. Una parte essenziale della diagnosi di un problema è guardare il messaggio di errore prodotto; anche se non lo capisci, rende la vita molto più facile per coloro a cui chiedi aiuto.

Quanto segue sarebbe stato un po 'più utile:

perl -we 'open(FILE, "<", "./test.txt") or die "open: $!";
          truncate(FILE, 8) or die "truncate: $!";
          close(FILE);'

anche se è vero che avrebbe riportato solo "argomenti non validi". Tuttavia, questa è un'informazione utile e potrebbe averti portato alla conclusione che la modalità aperta era sbagliata (come ha fatto per me).


3

È possibile utilizzare tailper tagliare gli ultimi 100000 byte, ad esempio:

tail -c 100000 file> file2

-c restituisce i 100000 byte finali del file, per ulteriori opzioni:

coda dell'uomo

Per sostituire il file originale con il file appena generato:

file mv file2


2

La risposta sopra citata troncata è buona. dd farà anche il lavoro:

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt

1
La frase chiave è "a una data dimensione" , diciamo 1000. Al contrario, cambierò la risposta a quella più votata, che funziona al momento dell'input - non è necessario un file intermedio.
xpt

0

c'è un modo completamente diverso di farlo, con bash, usando il programma ed. lo script seguente manterrà solo le ultime 5000 righe di tutti i file presenti nella directory specificata. questo può essere facilmente modificato per scorrere su più directory, cambiare il numero di righe, ecc.

#!/bin/bash

LOGDIR=/opt/log
SAVELINES=5000

dirs="$LOGDIR"
for dir in $dirs ; do
    files=${dir}/*
    for f in $files ; do
        echo -e "1,-${SAVELINES}d\nwq" | ed $f 1>/dev/null 2>&1
    done
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.