Comment obtenir les tailles récapitulatives des répertoires et de leurs sous-répertoires?


307

Disons que je veux obtenir la taille de chaque répertoire d'un système de fichiers Linux. Lorsque je l'utilise, ls -laje ne reçois pas vraiment la taille récapitulative des dossiers.

Si j’utilise, dfj’obtiens la taille de chaque système de fichiers monté, mais cela ne m’aide pas non plus. Et avec duje reçois la taille de chaque sous-répertoire et le résumé de tout le système de fichiers.

Mais je veux avoir seulement la taille résumée de chaque répertoire dans le dossier ROOT du système de fichiers. Y a-t-il un commandement pour y parvenir?


Le --totaldrapeau m'a été utile. Par exemple du -sh --total applications/*. askubuntu.com/a/465436/48214
Ryan

Réponses:


433

Cela fait ce que vous cherchez:

du -sh /*

Qu'est-ce que cela signifie:

  • -s pour ne donner que le total pour chaque argument de ligne de commande.
  • -hpour les suffixes lisibles par l’homme comme Mpour les mégaoctets et les Ggigaoctets (facultatif).
  • /*étend simplement à tous les répertoires (et fichiers) dans /.

    Remarque: les fichiers de points ne sont pas inclus. courir shopt -s dotglobpour inclure ceux aussi.

Le tri par taille est également utile:

du -sh /* | sort -h

Ici:

  • -hveille à ce que sortle suffixe lisible par l'homme soit interprété correctement.

8
Si vous avez des répertoires points dans le répertoire racine, vous pouvez les shopt -s dotglobinclure dans le nombre.
Philipp

8
C'est très utile, car c'est simple et vous pouvez placer le chemin que vous voulez à la place /*, par exemple ./pour le répertoire en cours ou ./*pour chaque élément du répertoire en cours.
psur

3
@ psur ou vous pouvez utiliser ./*/pour obtenir uniquement les sous-dossiers et pas tous les éléments
Relascope

7
Version triée:du -sh /* | sort -h
Vu Anh le

2
@ c1phr Si vous sortn'en avez pas -h, vous devez le laisser duaussi, sinon le tri va mélanger kilo / méga / gigaoctet. du -s /* | sort -nr.
Thomas

79

J'ai souvent besoin de trouver les plus gros répertoires, donc pour obtenir une liste triée contenant les 20 plus grands répertoires, je fais ceci:

du -m /some/path | sort -nr | head -n 20

Dans ce cas, les tailles seront indiquées en mégaoctets.


11
Voici un moyen de le rendre plus lisible du -sh / some / path | trier -hr | tête -n 20
Xedecimal

6
@Xedecima le problème avec l'utilisation de h est que la sorte ne sait pas comment gérer différentes tailles. Par exemple, 268K est trié plus haut que 255M, et les deux sont triés plus haut que 2.7G
chrisan

4
L'argument -h (lisible par l'homme) de la commande 'sort' devrait correctement lire ces valeurs. Tout comme le drapeau de duh les exporte. En fonction de ce que vous utilisez, je devine.
Xedecimal le

Fonctionne dans Ubuntu 16.04. Bon conseil.
SDsolar

sudo du -haxt 1G / | trier -hr | tête -30
déviant

22

J'aime utiliser Ncdu pour cela, vous pouvez utiliser le curseur pour naviguer dans la structure de répertoires, cela fonctionne vraiment bien.


Impressionnant. Mots-clés: du met ncurses. Vous pouvez utiliser bpour déposer dans un shell dans le répertoire.
Ciro Santilli a été invité le

11

Les réponses existantes sont très utiles, peut-être que certains débutants (comme moi) le trouveront également utile.

  1. Boucle très basique, mais pour moi, c'était un bon début pour d'autres opérations liées à la taille:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Très similaire à la première réponse et presque le même résultat que 1.), mais il m'a fallu un certain temps pour comprendre la différence de * à ./* si dans un sous-répertoire:

    du -sh ./*
    

for eachne fonctionne pas car il ajoute des caractères de console (par exemple \033[) à la liste des dossiers
machineaddict

@machineaddict ne sais pas ce que vous voulez dire. Je l'utilise tout le temps, ça marche très bien pour moi.
Martin le

essayez de lancer votre commande en commençant par for each. ça ne marchera pas
machineaddict

Je lance la commande exactement comme écrit ici. en commençant par pour chacun. travaux.
Martin

7

L' duinvocation suivante devrait fonctionner sur les systèmes BSD:

du -d 1 /

1
Mon du(Ubuntu 10.4) n'a pas d' -doption. Vous êtes sur quel système?
Thomas

Sur mon openSUSE, il n’a pas d’option -d non plus :(
2ndkauboy

OK, alors c’est une option BSD seulement (je suis sous OS X).
Philipp

La combinaison d’options portable droite sur BSD / * NIX est du -sk /*. Je déteste -ktellement ce genre de choses. Linux 'est -htotalement rock.
Dummy00001

dans d'autres systèmes, c'est--max-depth
Vishnu Kumar

4

Ce n'est pas facile La ducommande affiche les fichiers et les dossiers (par défaut) ou uniquement la taille de tous les éléments que vous spécifiez sur la ligne de commande (option -s).

Pour obtenir les éléments les plus volumineux (fichiers et dossiers), triés, avec des tailles lisibles par l'homme sous Linux:

du -h | sort -h

Cela vous enterrera dans une tonne de petits fichiers. Vous pouvez vous en débarrasser avec --threshold(1 Mo dans mon exemple):

du --threshold=1M -h | sort -h

L'avantage de cette commande est qu'elle inclut des dossiers à points cachés (les dossiers qui commencent par .).

Si vous ne voulez que les dossiers, vous devez les utiliser, findmais cela peut être très lent, car vous dudevrez analyser plusieurs dossiers plusieurs fois:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

1
--threshold ^^^ cette option n'est pas disponible sur linux
podarok

1
@podarok Il est disponible sur OpenSUSE 13.2 Linux. Essayez de trouver une version plus récente de votre distribution ou de compiler vous-même une version plus récente du paquet.
Aaron Digulla

Cela ne fonctionne pas sur Ubuntu LTS (14.04). C'est le plus récent))
podarok

@podarok Quelle version de GNU coreutils? Le mien est 8,24.
Aaron Digulla

1
La mise en cache aurait pu être un mauvais terme. Je pensais à quelque chose comme ce qui est fait dans ce port superuser.com/a/597173/121352 dans lequel nous scannons le contenu des disques une fois dans un mappage, puis continuons à utiliser les données de ce mappage plutôt que de frapper à nouveau le disque.
Hennes

1

Sachez que vous ne pouvez pas comparer des répertoires avec dudifférents systèmes / machines sans vous en assurer, les deux partagent la même taille de bloc du système de fichiers. Cela pourrait compter si vous synchronisez certains fichiers d'une machine Linux sur un NAS et que vous souhaitez comparer le répertoire synchronisé vous-même. Vous pourriez obtenir des résultats différents en duraison de différentes tailles de blocs ....


0

Vous pouvez également vouloir vérifier xdiskusage . Vous donnera les mêmes informations, mais montrées graphiquement, plus vous permet d’avancer dans le détail (très utile) Il existe d'autres utilitaires similaires pour KDE et même Windows.


0

Vous pouvez utiliser lsen conjonction avec awk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

La sortie de lsest raccordée à awk. awkcommence à traiter les données. Le délimiteur standard est l’espace. La variable somme totest initialisée à zéro; L'instruction suivante est exécutée pour chaque ligne / ligne générée par ls. Il augmente simplement totavec la taille. $5représente la cinquième colonne (sortie par ls). À la fin, nous divisons par (1024 * 1024) pour totaliser en mégaoctets.

Si vous voulez convertir cela en un script ou une fonction (.bashrc), vous pouvez également l'utiliser pour obtenir la taille de certains sous-ensembles de répertoires, en fonction des types de fichiers.

Si vous voulez des informations à l’échelle du système, kdirstatpeut - être utile!


Je conviens que l'on peut développer cet exemple et faire des astuces comme obtenir la taille de "certains sous-ensembles de répertoires, selon les types de fichiers", etc. cela peut sembler un bon point de départ. Néanmoins, cette solution est défectueuse dès le départ. Je recommande à tous les utilisateurs qui souhaitent utiliser cette méthode de lire les réponses et commentaires à cette question , ainsi que l' article qui y est lié . Je ne dis pas que vous ne pouvez pas le faire du tout. Connaître les limites, c'est tout.
Kamil Maciorowski
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.