Comando truncate in Linux: ridurre o estendere la dimensione dei file

truncate riduce o estende la dimensione logica di un file. Se la riduci, perdi i byte oltre il nuovo limite; se la estendi, la nuova regione si legge come byte zero e può occupare meno spazio fisico della sua lunghezza grazie alle aree sparse.

Gli esempi usano GNU Coreutils. Controlla truncate --help e man truncate sulla macchina di destinazione. Per le prove crea una cartella nuova con mkdir truncate-demo && cd truncate-demo e continua soltanto se entrambi i comandi riescono. Usa file dimostrativi: un nome già esistente può indicare dati che verranno modificati senza richiesta di conferma.

Cos'è il comando truncate?

La dimensione logica è il numero di byte fra l’inizio e la fine del file, distinto dallo spazio effettivamente assegnato dal filesystem. Una regione sparsa, detta anche hole, rappresenta byte zero senza richiedere necessariamente blocchi di dati per tutta la sua estensione. GNU crea i file mancanti, salvo -c; sui file esistenti cambia la lunghezza senza copiare il contenuto da un altro file. La possibilità di estensione e l’allocazione dipendono anche dal filesystem.

Sintassi di base

truncate [OPTION]... FILE...

OPTION e FILE sono segnaposto. Devi indicare una dimensione con -s o un riferimento con -r; puoi specificare più file. Racchiudi tra virgolette i percorsi con spazi e usa -- prima degli operandi se un nome inizia con un trattino. Il valore negativo di una variazione va passato come argomento di -s, come nell’esempio successivo.

Uso di base di truncate

Ridurre un file a zero byte

Prepara nella cartella dimostrativa un file nuovo con printf 'demo\n' > application.log, poi esegui il comando seguente. Il nome rimane e il contenuto diventa lungo zero byte. Non significa che ogni attributo resti invariato: su Linux, quando la dimensione cambia, si aggiornano le date di modifica dei dati e dei metadati e possono essere rimossi alcuni bit speciali di esecuzione, come descrive il manuale Linux di truncate e ftruncate. Per un vero log di servizio valuta la rotazione prevista dall’applicazione: troncare il file non azzera gli offset dei processi che lo hanno già aperto.

truncate -s 0 application.log

Creare un file con una dimensione logica specificata

Senza suffisso la dimensione è espressa in byte. Nelle opzioni GNU M e MiB significano 1.048.576 byte, mentre MB significa 1.000.000 byte. Quindi le righe seguenti richiedono rispettivamente 104.857.600 e 1.073.741.824 byte di lunghezza logica. Crea questi file soltanto dove hai spazio e limiti adeguati: la presenza di aree sparse non costituisce una prenotazione dello spazio necessario alle scritture future.

truncate -s 100M test.img
truncate -s 1GiB sparse.img

Aumentare o ridurre rispetto alla dimensione corrente

Il prefisso + aggiunge la quantità indicata, mentre - la sottrae. Per riprodurre un risultato preciso nella cartella dimostrativa prepara data.bin con truncate -s 1M data.bin. Eseguendo nell’ordine le due righe seguenti ottieni prima 11.534.336 byte e poi 11.010.048 byte. Se parti da una dimensione diversa, cambiano anche i risultati; una riduzione elimina la parte finale del file.

truncate -s +10M data.bin
truncate -s -512K data.bin

Verificare la dimensione dopo aver svuotato il file

truncate normalmente non stampa messaggi quando riesce. Questo blocco crea una sottocartella nuova, si ferma se la preparazione o il troncamento falliscono e mostra la dimensione con stat. Le parentesi mantengono invariata la directory della shell principale.

(
  mkdir truncate-check || exit 1
  cd truncate-check || exit 1
  printf 'abc' > demo.txt || exit 1
  truncate -s 0 demo.txt || exit 1
  stat -c '%s %n' demo.txt
)

L’output atteso è 0 demo.txt. La prova conferma la nuova lunghezza, non la cancellazione sicura dei dati dal supporto. truncate non offre un comando per recuperare i byte scartati: se servono ancora, occorre una copia di riserva valida. Prima di modificare un file reale controlla percorso e backup; un messaggio d’errore va letto anche quando un controllo successivo mostra un file esistente.

Opzioni principali

Opzione Scopo
-s SIZE Imposta la lunghezza assoluta o la modifica secondo il prefisso scelto. Senza -o la quantità è in byte, con l’eventuale suffisso.
-c Non crea i file mancanti. In GNU un file assente può essere ignorato senza errore: controlla separatamente che il bersaglio esista.
-r FILE Usa la lunghezza logica del riferimento, senza copiarne dati o metadati.
-o Interpreta SIZE come numero di blocchi di I/O del file, non di byte. Non presumere che il blocco di I/O sia sempre di 512 byte.

I prefissi GNU < e > impongono rispettivamente un massimo e un minimo; / arrotonda per difetto a un multiplo e % per eccesso. Racchiudi tra apici i valori contenenti caratteri che la shell potrebbe interpretare, per esempio '<100M'. I dettagli di -o e delle estensioni GNU vanno verificati sul sistema di destinazione.

Esempi pratici

Impostare la dimensione da un file di riferimento

Per una prova nuova crea reference.img con printf 'REF' > reference.img e target.img con printf 'abcdef' > target.img. Dopo le righe seguenti stat mostra 3 reference.img e 3 target.img. Il bersaglio contiene abc, non REF: -r usa soltanto la dimensione del riferimento. Un bersaglio inizialmente più corto viene invece esteso con una regione che si legge come zeri.

truncate -r reference.img target.img
stat -c '%s %n' reference.img target.img

Imporre una dimensione massima o minima

'<100M' riduce cache.bin soltanto se supera 100 MiB; se è già più piccolo lo lascia di quella dimensione. '>1M' estende placeholder.bin soltanto se è più piccolo di 1 MiB. Per una prova ripetibile crea prima cache.bin con truncate -s 101M cache.bin e placeholder.bin con truncate -s 0 placeholder.bin: dopo le due righe otterrai rispettivamente 104.857.600 e 1.048.576 byte. Gli apici impediscono che < e > diventino redirezioni della shell.

truncate -s '<100M' cache.bin
truncate -s '>1M' placeholder.bin

Confrontare dimensione logica e spazio assegnato

Qui 1G equivale a 1 GiB: il primo campo di stat deve quindi indicare size=1073741824. %b conta i blocchi assegnati, normalmente in unità di 512 byte nel formato GNU; stat -c '%B' sparse.img mostra la dimensione in byte di quell’unità. Non confonderla con il blocco di I/O usato da -o. du -h mostra l’utilizzo del disco in forma leggibile: può risultare molto più piccolo della lunghezza logica, ma il valore esatto dipende da filesystem e dati già presenti. Questo comando riutilizza sparse.img dell’esempio precedente e non ne cancella eventuali dati compresi nella nuova lunghezza.

truncate -s 1G sparse.img
stat -c 'size=%s blocks=%b' sparse.img
du -h sparse.img

truncate e comandi correlati

Comando o metodo Ruolo principale Quando usarlo
truncate Cambiare la fine logica del file Ridimensionare file e creare regioni sparse quando supportate
touch Creare un file vuoto o aggiornare le date Mantenere contenuto e dimensione di un file già esistente
dd Scrivere o copiare dati secondo blocchi e opzioni Riempire o copiare contenuti; richiede una scelta accurata degli operandi
Strumento di rotazione dei log Gestire archiviazione, compressione e riapertura secondo la configurazione Gestione dei log dei servizi in esercizio

Avvertenze importanti

La riduzione distrugge i dati

I byte oltre la nuova fine non tornano aumentando di nuovo la lunghezza: la regione aggiunta si legge come zeri, non come il contenuto precedente. Un collegamento fisico condivide gli stessi dati e vede il medesimo troncamento; non è una copia di riserva. Controlla anche eventuali collegamenti simbolici per capire a quale file conduce il percorso prima di modificarlo. Una prova su un duplicato indipendente e un backup verificato riducono il rischio di perdere l’unica copia utile.

L'estensione non ripara un formato interno

Aumentare un file chiamato .img non crea automaticamente un filesystem utilizzabile e non espande partizioni o strutture interne di un formato. Per un’immagine di disco, un database o un volume usa gli strumenti previsti da quel formato e verifica separatamente il suo stato. Anche creare un file grande con regioni sparse non garantisce che ci sarà spazio quando un programma riempirà tali regioni.

I file sparsi possono espandersi durante la copia

Se il programma di copia o il filesystem di destinazione non conserva le aree sparse, la copia può occupare spazio vicino alla lunghezza logica completa. Controlla le opzioni dello strumento e misura il risultato; anche esportazione, archiviazione e ripristino possono cambiare l’allocazione. La sola uguaglianza delle dimensioni mostrate da stat non dimostra che due file abbiano lo stesso contenuto o la stessa occupazione fisica.

FAQ

truncate -s 0 elimina il file?

No. Mantiene il nome del file e porta la lunghezza a zero, scartandone il contenuto. Le date possono cambiare e alcuni bit speciali possono essere rimossi: non è una promessa di conservazione di tutti gli attributi.

Estendere un file occupa subito tutto lo spazio indicato?

Non necessariamente. Il filesystem può rappresentare l’estensione con regioni sparse che si leggono come zeri. Confronta la lunghezza di stat con l’occupazione di du; le scritture successive potrebbero richiedere nuovo spazio.

Come posso evitare di creare un file mancante?

Usa truncate -c -s DIMENSIONE FILE, sostituendo i segnaposto. GNU può terminare senza errore anche se il file assente viene ignorato: se l’esistenza è necessaria, controllala esplicitamente prima e verifica il risultato.

-r copia i dati dal riferimento?

No. -r usa soltanto la dimensione logica. Il prefisso già presente nel bersaglio resta il suo, mentre un’eventuale estensione si legge come byte zero.

Documentazione di riferimento