Linux / Commande du : mesurer la taille des fichiers et répertoires

du est une commande qui calcule et affiche la quantité d'espace utilisée par les fichiers et répertoires spécifiés sur le système de fichiers. Pour afficher les totaux du répertoire courant et de ses sous-répertoires directs dans un format lisible par l'homme, utilisez du -h --max-depth=1 ., et pour voir seulement le total, utilisez du -sh ..

du -h --max-depth=1 .
du -sh .

Le comportement par défaut de du est basé sur les blocs réellement alloués sur le système de fichiers, et non sur la taille apparente du contenu des fichiers. Dans le cas des fichiers creux, des systèmes de fichiers compressés, des liens physiques et des environnements copie à l’écriture (Copy-on-Write, CoW), les chiffres peuvent différer de ceux produits par d'autres outils.

Que calcule la commande du ?

Ce guide utilise GNU du et GNU sort, généralement fournis par Coreutils sous Linux. Vérifiez les versions avec du --version et sort --version. Les chemins comme ./data et /var sont des exemples à adapter.

du signifie disk usage, ou utilisation du disque, et il parcourt les arbres de fichiers et de répertoires pour additionner l'utilisation du disque. Comme il est affecté non seulement par le contenu des fichiers mais aussi par la méthode d'allocation des blocs du système de fichiers, il ne correspond pas toujours à la taille du fichier affichée par ls -l.

Les options et les limitations de calcul peuvent être consultées dans la documentation officielle de GNU Coreutils du.

Commandes de base les plus fréquemment utilisées

Vérifiez la taille totale du répertoire actuel

du -sh .

-s affiche uniquement le total, tandis que -h affiche en unités lisibles par l'homme binaires avec les suffixes K, M et G. Les fichiers et répertoires cachés sont également inclus dans le total du répertoire actuel.

Afficher les sous-répertoires directs

du -h --max-depth=1 .

--max-depth=1 affiche jusqu'à un niveau en dessous du point de départ. Dans GNU du, vous pouvez également l'écrire brièvement comme -d 1, mais d'autres variantes Unix peuvent ou non supporter cela. Sans -a, les fichiers ordinaires contribuent aux totaux sans avoir leur propre ligne. Ajoutez -a si vous souhaitez également les afficher. La ligne du répertoire de départ inclut ses descendants : ne l’additionnez pas une seconde fois aux sous-totaux.

Trouvez les gros éléments en les triant

du -h --max-depth=1 /var | sort -h

sort -h trie en considérant les unités lisibles par l'homme. Pour afficher les gros éléments en haut, utilisez sort -hr.

du -h --max-depth=1 /var | sort -hr

Les répertoires sans autorisation peuvent produire des erreurs, et le total peut être incomplet. Exécutez uniquement avec les autorisations appropriées pour le périmètre requis, et ne vous contentez pas de masquer les erreurs et d'interpréter les résultats comme des valeurs complètes.

Résumé des principales options

Option Fonction Exemples d'utilisation
-h Afficher en unités lisibles par l'homme du -h /var/log
-s Afficher uniquement le total de chaque argument du -sh /var/log
-a Afficher non seulement les répertoires mais aussi les fichiers du -ah ./data
-c Ajouter un total général à la fin du -ch file1 file2
-d N Spécifier la profondeur maximale des répertoires à afficher du -h -d 2 .
-x Ne pas traverser d'autres systèmes de fichiers du -xhd1 /
--exclude Exclure les chemins correspondant à un motif du -sh --exclude='*.log' .
--apparent-size Afficher la taille apparente au lieu de l'espace alloué du -sh --apparent-size file

Rechercher les fichiers et répertoires en détail

Afficher tous les fichiers

du -ah ./data | sort -hr | head -n 20

Utile pour trouver rapidement des éléments de niveau supérieur dans de petits répertoires. Sur de grands systèmes de fichiers, cela peut utiliser beaucoup d'E/S disque et de mémoire car il parcourt et trie tous les chemins.

Afficher uniquement les éléments supérieurs à une taille minimale

du -ah --threshold=1G ./data

L’option --threshold=1G de GNU du conserve les résultats atteignant au moins 1 Gio, soit 1 073 741 824 octets. Cela peut ne pas être pris en charge sur certaines distributions ou autres implémentations Unix, donc vérifiez du --help si la portabilité est nécessaire.

Exclure des fichiers ou répertoires spécifiques

du -sh --exclude='*.log' --exclude='cache' .

Il est sûr de mettre le motif pour --exclude entre des guillemets simples pour empêcher le shell de l'étendre en premier. S'il y a de nombreuses règles d'exclusion, vous pouvez créer un fichier avec une règle par ligne et utiliser --exclude-from.

du -sh --exclude-from=du-exclude.txt .

La différence entre l’espace alloué et la taille apparente

Utilisation de disque de base

Le du de base résume les blocs alloués aux fichiers par le système de fichiers. Un petit fichier occupe souvent un bloc entier, mais certains systèmes de fichiers peuvent stocker son contenu directement dans leurs métadonnées, et les métadonnées du fichier ou la structure interne du système de fichiers peuvent ne pas être entièrement reflétées dans le résultat.

Taille apparente

--apparent-size montre une valeur proche de la longueur logique du contenu pour les fichiers ordinaires.

Pour observer la différence, créez deux fichiers dans un nouveau dossier temporaire avec GNU Coreutils. truncate fixe ici une longueur logique sans écrire explicitement un mégaoctet de contenu.

du_start=$PWD
du_demo=$(mktemp -d) || exit 1
cd "$du_demo" || exit 1
printf zoo > tiny.txt
truncate -s 1M sample.img
du -b tiny.txt sample.img

du -b affiche les tailles apparentes en octets : 3 pour tiny.txt et 1048576 pour sample.img. Comparez ensuite les deux commandes suivantes ; la quantité réellement allouée dépend du système de fichiers et de la prise en charge des fichiers creux.

du -h sample.img
du -h --apparent-size sample.img

Les fichiers creux peuvent avoir une taille logique très grande mais utiliser presque aucun bloc réel. Inversement, dans des environnements avec compression du système de fichiers, déduplication, instantanés ou blocs partagés copie à l’écriture (Copy-on-Write, CoW), le du de base peut également différer de la consommation réelle sur le périphérique physique.

Après la comparaison, revenez au répertoire initial avec cd "$du_start". Vérifiez le chemin conservé dans du_demo, puis supprimez seulement les deux fichiers d’essai et ce dossier si vous n’en avez plus besoin.

Liens physiques

Si plusieurs chemins pointent vers le même inode, l’identifiant de leurs métadonnées dans le système de fichiers, en tant que liens physiques, GNU du compte par défaut l'espace du même fichier une seule fois. Selon l'ordre dans lequel plusieurs arguments sont passés, l'utilisation peut être attribuée à différents chemins. L'utilisation d'options qui calculent chaque lien séparément peut entraîner un total supérieur aux blocs uniques réels.

Limitation des frontières du système de fichiers

Ignorer d'autres points de montage

Lors de l'examen du système de fichiers racine, l'utilisation de -x ou --one-file-system empêche de descendre dans d'autres systèmes de fichiers.

du -xhd1 /

Cette option réduit la chance de traverser involontairement des systèmes de fichiers réseau, des volumes de données séparés ou des systèmes de fichiers virtuels. Les montages de type bind appartenant au même système de fichiers ne sont toutefois pas exclus par cette option. L’utilisation des systèmes de fichiers distincts est exclue des résultats, donc assurez-vous qu'elle correspond à votre objectif d'enquête.

Gestion des liens symboliques

Par défaut, du ne suit pas les cibles des liens symboliques dans les arguments de ligne de commande ou dans les répertoires. Les options pour suivre les liens peuvent traverser de grandes quantités d'autres répertoires ou systèmes de fichiers, donc vérifiez la structure cible avant de les utiliser.

Raisons pour lesquelles les résultats de du et df diffèrent

Les cibles de calcul sont différentes

du résume les fichiers dans les répertoires auxquels il peut accéder, alors que le guide de df (en anglais) rapporte l'utilisation pour l'ensemble du système de fichiers. Des différences peuvent survenir en raison des métadonnées du système de fichiers, des blocs réservés, des instantanés, ou des chemins qui ne peuvent pas être lus à cause des permissions.

Fichiers supprimés mais ouverts

Si un fichier est supprimé alors qu'un processus l'a ouvert, du ne peut pas trouver le fichier si seul le chemin est supprimé, mais les blocs ne sont pas libérés tant que le processus n'a pas fermé le fichier, donc df le montre toujours comme étant utilisé. Vous pouvez vérifier les fichiers ouverts supprimés comme suit.

lsof +L1

lsof doit être installé et ne montre que les processus que vos droits permettent d’inspecter. Son manuel officiel décrit +L1, qui sélectionne les fichiers ouverts dont le nombre de liens est inférieur à un.

Ne terminez pas le processus cible de force. Vérifiez plutôt le redémarrage normal du service et les procédures de réouverture des journaux. Manipuler arbitrairement le descripteur de fichier d’un fichier supprimé peut provoquer une perte de données ou une interruption de service.

Utiliser du avec méthode

  • Tout d’abord, vérifiez le système de fichiers complet avec df -h, puis exécutez du dans le point de montage respectif.
  • Lors d’une investigation depuis la racine, décidez s’il faut exclure d’autres systèmes de fichiers en utilisant -x.
  • Pour les grands répertoires, commencez par un sous-arbre ciblé pendant une période de faible charge. Une faible profondeur d’affichage ne dispense pas de parcourir les descendants.
  • S’il y a des erreurs de permission, notez que les résultats sont incomplets et utilisez uniquement les permissions minimales nécessaires.
  • Avant de supprimer un fichier, vérifiez le processus propriétaire, la sauvegarde, la politique de conservation et si une récupération est possible.
  • Les noms de fichiers peuvent contenir des caractères spéciaux tels que des sauts de ligne, donc envisagez d'utiliser une combinaison d'outils qui supportent la séparation NUL dans l'automatisation.

Questions fréquemment posées

Les fichiers cachés sont-ils inclus dans les résultats de du ?

Si vous spécifiez le répertoire lui-même, comme du -sh ., les fichiers cachés sont inclus dans le total. Cependant, le * de l'interpréteur de commandes ne fait par défaut pas correspondre les éléments cachés, donc les résultats du -sh * peuvent les exclure.

Comment puis-je trouver rapidement les plus grands répertoires ?

Vérifiez étape par étape en utilisant du -h --max-depth=1 target | sort -hr. La profondeur limite les lignes affichées, mais du parcourt toujours les descendants pour calculer les totaux. Pour réduire les lectures, choisissez un sous-arbre plus petit ou excluez les chemins inutiles.

Pourquoi les tailles sont-elles différentes entre du -sh et ls -lh ?

ls -lh montre principalement la longueur logique des fichiers, tandis que du par défaut montre les blocs du système de fichiers alloués. Des différences peuvent survenir en raison des fichiers creux, des petits fichiers et des tailles de blocs.

Est-il acceptable de masquer l'erreur 'Permission denied' ?

Bien que cela puisse rendre l'écran plus propre, le fait que les résultats soient incomplets disparaît également. Dans les enquêtes sur la capacité, il est plus sûr de vérifier d'abord le chemin où l'erreur s'est produite et d'examiner la raison et la portée des permissions requises.

Résumé

du -sh path montre le total, et du -h --max-depth=1 path affiche le total du chemin et de chaque sous-répertoire direct. Lors de la recherche de gros éléments, combinez avec sort -hr, et utilisez -x pour exclure les autres systèmes de fichiers.

La valeur du est une estimation affectée par la structure du système de fichiers et la méthode d'allocation. S'il y a une différence avec df, vous devez vérifier les fichiers ouverts supprimés, les blocs réservés, les instantanés et les problèmes d'autorisation.