Introduzione

In alcune situazioni, potresti voler troncare (svuotare) un file esistente a lunghezza zero. In parole semplici, troncare un file significa rimuovere il contenuto del file senza eliminare il file.

Troncare un file è molto più veloce e più facile che eliminarlo o ricrearlo  e impostare le autorizzazioni e proprietà corrette. Inoltre, se il file viene aperto da un processo, la rimozione del file può causare il malfunzionamento del programma che lo utilizza.

Questo tutorial spiega come troncare i file a dimensione zero nei sistemi Linux usando il reindirizzamento della shell e il comando truncate.

Shell Redirection

Il metodo più semplice e più utilizzato per troncare i file è utilizzare l'operatore > di reindirizzamento della shell.

Il formato generale per troncare i file utilizzando il reindirizzamento è:

: > filename

Analizziamo il comando:

  • I due punti : significano true e non producono output.
  • L'operatore di reindirizzamento  > reindirizza l'output del comando precedente sul file specificato.
  • filename, il file che si desidera troncare.

Se il file esiste, verrà troncato a zero. Altrimenti, verrà creato il file.

Invece di : è possibile anche usare un altro comando che non produce output.

Ecco un esempio dell'uso del comando cat per generare il contenuto del dispositivo /dev/null, che restituisce solo un carattere di fine file:

cat /dev/null > filename

Un altro comando che può essere utilizzato è echo. L'opzione -n dice di non aggiungere una nuova riga:

echo -n > filename

Sulla maggior parte delle shell moderne come Bash o Zsh è possibile omettere il comando prima del simbolo di reindirizzamento e utilizzare:

> filename

Per poter troncare un file, è necessario disporre delle autorizzazioni di scrittura sul file. Di solito, useresti il comando sudo, ma i privilegi di root elevati non si applicano al reindirizzamento. Ecco un esempio:

sudo : > /var/log/syslog

Dovresti ricevere un messaggio di output simile al seguente:

bash: /var/log/syslog: Permission denied

Esistono diverse soluzioni che consentono il reindirizzamento con sudo. La prima opzione può eseguire una nuova shell con sudo ed eseguire un comando all'interno di quella shell usando il flag -c:

sudo sh -c '> filename'

Un'altra opzione è di inoltrare l'output al comando tee, elevare i privilegi tee con sudo e scrivere l'output vuoto in un determinato file:

: | sudo tee filename

Comando truncate

truncate è un'utilità della riga di comando che consente di ridurre o estendere la dimensione di un file a una determinata dimensione.

La sintassi generale per troncare i file a dimensione zero con il comando truncate è la seguente:

truncate -s 0 filename

L'opzione -s 0 imposta la dimensione del file su zero.

Ad esempio, per svuotare il registro di accesso (file log) di Nginx dovresti usare:

sudo truncate -s 0 /var/log/nginx/access.log

Svuotare tutti i file di registro (log)

Nel tempo, l'unità disco potrebbe essere ingombra di molti file di registro di grandi dimensioni che occupano grandi quantità di spazio su disco.

Il seguente comando svuota i file che terminano con ".log" nella directory /var/log:

sudo truncate -s 0 /var/log/**/*.log 

Un'opzione migliore sarebbe quella di ruotare, comprimere e rimuovere i file di registro con lo strumento logrotate.

Conclusione

Per troncare un file in Linux, utilizzare l'operatore di reindirizzamento > seguito dal nome del file.