Linux : vider un fichier sans le supprimer avec truncate

truncate

De temps en temps, un fichier prend un peu trop ses aises sur le disque. C’est souvent un fichier de log, un fichier temporaire, une sortie de script ou un vieux fichier d’erreurs oublié dans un coin.

Sous Linux, vous pouvez le vider sans le supprimer grâce à la commande truncate. C’est rapide, propre, et beaucoup plus sûr que de supprimer le fichier puis de le recréer à la main.

La commande de base est simple :

truncate -s 0 /home/skyminds/error.log

L’option -s 0 signifie : fixer la taille du fichier à 0 octet. Le fichier existe toujours, mais son contenu disparaît.

Pourquoi utiliser truncate ?

truncate sert à réduire ou étendre un fichier à une taille donnée. Pour vider un fichier, on lui demande simplement une taille de zéro octet.

Son avantage principal : le fichier reste en place. Son chemin, ses permissions et son propriétaire ne changent pas.

C’est particulièrement utile pour les fichiers de logs. Un service comme Apache, Nginx, PHP-FPM, MariaDB ou une application maison peut garder un fichier ouvert. Si vous supprimez ce fichier, le processus peut continuer à écrire dans un fichier supprimé mais encore ouvert. Charmant piège Unix.

Avec truncate, vous videz le contenu sans casser le lien entre le processus et le fichier.

Vider un fichier avec truncate

Pour vider un fichier précis :

truncate -s 0 /chemin/vers/fichier.log

Exemple avec un fichier de log utilisateur :

truncate -s 0 ~/error.log

Exemple avec un log système nécessitant les droits administrateur :

sudo truncate -s 0 /var/log/nginx/error.logCode language: JavaScript (javascript)

Vous pouvez vérifier le résultat avec ls :

ls -lh /var/log/nginx/error.logCode language: JavaScript (javascript)

Ou avec stat :

stat /var/log/nginx/error.logCode language: JavaScript (javascript)

La taille doit maintenant être de 0 octet.

Éviter la création accidentelle d’un fichier

Par défaut, truncate crée le fichier si celui-ci n’existe pas. C’est documenté, mais parfois indésirable.

Pour éviter de créer un nouveau fichier par erreur, utilisez l’option -c ou --no-create :

truncate -c -s 0 /chemin/vers/fichier.log

Avec cette option, si le fichier n’existe pas, truncate ne le crée pas. C’est plus sûr dans un script, surtout quand le chemin est construit dynamiquement.

Vider plusieurs fichiers de logs

Pour vider plusieurs fichiers en une seule commande :

sudo truncate -s 0 /var/log/nginx/access.log /var/log/nginx/error.logCode language: JavaScript (javascript)

Pour vider tous les fichiers .log d’un dossier précis :

sudo find /var/log/mon-app -maxdepth 1 -type f -name "*.log" -exec truncate -s 0 {} +Code language: JavaScript (javascript)

Ne lancez pas ce genre de commande sur /var/log entier sans réfléchir. Certains logs sont gérés par des services spécifiques, d’autres sont compressés, et certains fichiers ne devraient pas être touchés à chaud.

Alternative rapide : redirection shell

Vous pouvez aussi vider un fichier avec une redirection shell :

> /chemin/vers/fichier.logCode language: JavaScript (javascript)

Ou avec la commande vide : :

: > /chemin/vers/fichier.logCode language: JavaScript (javascript)

Ces deux formes fonctionnent très bien dans un shell interactif. Mais avec sudo, il y a un piège classique.

Cette commande échoue souvent :

sudo echo "" > /var/log/nginx/error.logCode language: PHP (php)

Pourquoi ? Parce que la redirection > est gérée par votre shell courant, pas par sudo. Votre utilisateur tente donc d’écrire dans le fichier avant que sudo n’aide vraiment. Bash a de l’humour, mais il le cache bien.

Dans ce cas, utilisez plutôt :

sudo truncate -s 0 /var/log/nginx/error.logCode language: JavaScript (javascript)

Ou, si vous tenez à la redirection :

sudo sh -c ': > /var/log/nginx/error.log'Code language: JavaScript (javascript)

Ne pas confondre vider, supprimer et faire tourner les logs

Vider un fichier avec truncate n’est pas la même chose que le supprimer.

ActionEffetUsage
truncate -s 0 fichier.logVide le fichier sans le supprimerNettoyer vite un fichier existant
rm fichier.logSupprime le nom du fichierÀ éviter pour un log actif
logrotateArchive, compresse et recrée les logs selon une politiqueSolution propre et durable

Pour une urgence, truncate est parfait. Pour une stratégie de maintenance, utilisez logrotate. Vider un log à la main toutes les semaines, c’est un symptôme. Pas une architecture.

Cas des logs systemd et journald

Sur les distributions modernes, beaucoup de logs passent aussi par systemd-journald. Dans ce cas, vous ne videz pas un simple fichier texte avec truncate.

Pour voir l’espace utilisé par le journal systemd :

journalctl --disk-usage

Pour réduire les journaux à une taille maximale :

sudo journalctl --vacuum-size=500M

Pour supprimer les entrées plus anciennes qu’une durée donnée :

sudo journalctl --vacuum-time=14d

Ici, truncate n’est pas le bon outil. Utilisez les commandes prévues par journalctl.

Voir quels processus utilisent encore un fichier

Avant de vider ou supprimer un gros log, vous pouvez vérifier s’il est encore ouvert par un processus.

sudo lsof /var/log/nginx/error.logCode language: JavaScript (javascript)

Pour repérer les fichiers supprimés mais encore ouverts, très utile quand l’espace disque ne revient pas après un rm :

sudo lsof | grep deleted

Si un processus garde un fichier supprimé ouvert, l’espace disque peut rester occupé jusqu’au redémarrage du service. Dans ce cas, redémarrer ou recharger le service concerné peut libérer l’espace.

Exemple avec Nginx :

sudo systemctl reload nginx

Exemple avec PHP-FPM, à adapter selon votre version :

sudo systemctl reload php8.3-fpmCode language: CSS (css)

Réduire un fichier à une taille précise

truncate ne sert pas seulement à vider un fichier. Il peut aussi fixer une taille précise.

Créer ou fixer un fichier à 10 Mo :

truncate -s 10M fichier-test.imgCode language: CSS (css)

Réduire un fichier à 1 Go :

truncate -s 1G gros-fichier.logCode language: CSS (css)

Créer un fichier sparse de 1 Go pour un test :

truncate -s 1G sparse-file.imgCode language: CSS (css)

Attention : un fichier sparse peut afficher une grande taille logique sans occuper réellement autant d’espace disque. C’est normal, et parfois très utile pour les tests.

Vider un fichier dans un script Bash

Dans un script, soyez plus défensif. Vérifiez que le fichier existe et que c’est bien un fichier régulier.

#!/usr/bin/env bash

set -euo pipefail

file="/home/skyminds/error.log"

if [[ ! -f "$file" ]]; then
    printf 'Erreur : fichier introuvable ou non régulier : %s\n' "$file" >&2
    exit 1
fi

truncate -s 0 "$file"

printf 'Fichier vidé : %s\n' "$file"Code language: PHP (php)

Cette version évite de créer un fichier par erreur et protège contre les chemins inattendus. C’est plus verbeux, mais beaucoup moins joueur.

Checklist avant de vider un fichier

  • Vérifiez que le fichier ciblé est bien le bon.
  • Utilisez truncate -s 0 pour vider sans supprimer.
  • Ajoutez -c si vous ne voulez pas créer un fichier absent.
  • Évitez rm sur un log actif.
  • Utilisez sudo truncate plutôt qu’une redirection shell bancale.
  • Pour les journaux systemd, utilisez journalctl --vacuum-*.
  • Mettez en place logrotate si le fichier grossit régulièrement.

À retenir

Pour vider un fichier sous Linux sans le supprimer, la commande à retenir est :

truncate -s 0 /chemin/vers/fichier.log

C’est simple, rapide et propre. Le fichier reste en place, ses permissions restent intactes, et les services qui l’utilisent ne perdent pas forcément leur référence.

Pour un fichier de log qui grossit sans arrêt, ne vous contentez pas de le vider à la main. Configurez une rotation correcte. truncate est un bon extincteur. logrotate est le système anti-incendie.

Sources

Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

Opinions