Comment lister la taille de chaque fichier et répertoire et trier par taille décroissante dans Bash?


108

J'ai trouvé qu'il n'est pas facile d'obtenir la taille d'un répertoire dans Bash?

Je veux que lorsque je tape ls -<some options>, il puisse lister toute la somme de la taille du fichier du répertoire et des fichiers en même temps et trier par ordre de taille.

Est-ce possible?


2
Qu'entendez-vous exactement par «taille» d'un répertoire? Le nombre de fichiers en dessous (récursivement ou non)? La somme des tailles des fichiers en dessous (récursivement ou non)? La taille du disque du répertoire lui-même? (Un répertoire est implémenté sous la forme d'un fichier spécial contenant les noms de fichiers et d'autres informations.)
Keith Thompson

devrait être La somme des tailles des fichiers en dessous de manière récursive
Kit Ho

1
@Kit: Alors duest la réponse.
Keith Thompson

La ducommande @KeithThompson @KitHo estime l'utilisation de l'espace fichier, vous ne pouvez donc pas l'utiliser si vous souhaitez obtenir la taille exacte.
ztank1013

@ ztank1013: Selon ce que vous entendez par "la taille exacte", du(au moins la version GNU coreutils) a probablement une option pour fournir les informations.
Keith Thompson

Réponses:


218

Naviguez simplement vers le répertoire et exécutez la commande suivante:

du -a --max-depth=1 | sort -n

OU ajoutez -h pour les tailles lisibles par l'homme et -r pour imprimer d'abord des répertoires / fichiers plus volumineux.

du -a -h --max-depth=1 | sort -hr

23
du -hexige sort -haussi, pour s'assurer que, disons 981Mavant 1.3G; avec sort -nseuls les chiffres seraient pris en compte et ils seraient dans le mauvais sens.
Smylers

Cela ne répertorie pas la taille des fichiers individuels dans le répertoire actuel, uniquement la taille de ses sous-répertoires et la taille totale du répertoire actuel. Comment incluriez-vous également des fichiers individuels dans la sortie (pour répondre à la question d'OP)?
Erik Trautman le

@ErikTrautman pour lister les fichiers que vous devez également ajouter -aet utiliser --allau lieu de --max-depth=1teldu -a -h --all | sort -h
Franco

Impressionnant! Je fais quelque chose de plus léger depuis quelques années maintenant. :)
Colby Blair

6
sort -hne fonctionne que sur la version GNU / Linux, pas de chance avec BSD / OS X.
djule5

20

Apparemment, l' --max-depthoption n'est pas dans la version Mac OS X de la ducommande. Vous pouvez utiliser ce qui suit à la place.

du -h -d 1 | sort -n


Apparemment, mais sans surprise.
Josh Habdas

20
du -s -- * | sort -n

(cela ne montrera pas les fichiers cachés (.dotfiles))

Utiliser du -smpour les unités Mb, etc. J'utilise toujours

du -smc -- * | sort -n

car la ligne totale ( -c) finira en bas pour des raisons évidentes :)

PS:

  • Voir les commentaires sur la gestion des fichiers dot
  • J'utilise fréquemment par exemple 'du -smc / home / / | sort -n | tail 'pour avoir une idée de l'emplacement exact des gros morceaux

5
du --max-depth=1|sort -nou find . -mindepth 1 -maxdepth 1|xargs du -s|sort -npour inclure des fichiers dotfiles aussi.
Arnaud Le Blanc

@arnoud: J'utilise aussi, mais il ne semble pas le plus approprié pour cette question (/ réponse) :)
sehe

@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nsi certains des chemins trouvés peuvent contenir des espaces.
Lri

1
C'est une excellente variante pour obtenir une vue lisible par l'homme du plus grand:sudo du -smch * | sort -h | tail
marsbard

16

Commander

du -h --max-depth=0 * | sort -hr

Production

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Explication

  • du affiche "utilisation du disque"
  • h est pour "lisible par l'homme" (à la fois en tri et en du)
  • max-depth=0signifie que la dutaille des sous-dossiers ne sera pas affichée (supprimez-la si vous souhaitez afficher toutes les tailles de chaque fichier dans chaque sous-, sous-sous-dossier, ..., dossier)
  • r est pour "reverse" (le plus gros fichier en premier)

ncdu

Quand je suis arrivé à cette question, je voulais nettoyer mon système de fichiers. L'outil de ligne de commande ncduest bien mieux adapté à cette tâche.

Installation sur Ubuntu:

$ sudo apt-get install ncdu

Usage:

Tapez simplement ncdu [path]la ligne de commande. Après quelques secondes pour analyser le chemin, vous verrez quelque chose comme ceci:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Supprimer l'élément actuellement sélectionné avec d, quitter avec CTRL+c


Vous pouvez aussi écrire du -hs * | sort -hr. -s (résumer) équivaut à --max-depth = 0
rasmusx

5

ls -Strie par taille. Ensuite, pour afficher la taille aussi, ls -lSdonne un affichage long ( -l), trié par taille ( -S). J'ajoute généralement -haussi, pour rendre les choses plus faciles à lire, donc ls -lhS,.


1
Ah, désolé, ce n'était pas clair dans votre message. Vous voulez du, semble que quelqu'un l'a posté. @sehe: Cela dépend de votre définition de réel - il montre la quantité d'espace que le répertoire utilise pour se stocker. (Il ne s'agit simplement pas d'ajouter la taille des sous-entrées.) Ce n'est pas un nombre aléatoire, et ce n'est pas toujours 4 Ko.
Thanatos

1

Simple et rapide:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* nécessite GNU Parallel .


0

Je pense que j'ai peut-être compris ce que vous voulez faire. Cela donnera une liste triée de tous les fichiers et de tous les répertoires, triés par taille de fichier et taille du contenu dans les répertoires.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

Qu'à cela ne tienne, sehe a présenté une solution beaucoup plus simple. J'apprends quelque chose de nouveau tous les jours!
dvorak

Je ne pense pas que l'utilisation dusoit une option, cela vous donnera juste un résultat approximatif.
ztank1013

0

[version améliorée]
Cela va être beaucoup plus rapide et précis que la version initiale ci-dessous et affichera la somme de toute la taille de fichier du répertoire actuel:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

la stat -c %scommande sur un fichier retournera sa taille en octets. La trcommande ici est utilisée pour surmonter les xargslimitations de la commande (apparemment, le xargsfait de diviser les résultats sur plus de lignes, brisant la logique de ma commande). Par conséquent, il trfaut remplacer le saut de ligne par le +signe (plus). seda le seul but de supprimer le dernier +signe de la chaîne résultante pour éviter les plaintes de la commande finale bc(calculatrice de base) qui, comme d'habitude, fait le calcul.

Performances: Je l'ai testé sur plusieurs répertoires et plus de ~ 150.000 fichiers en haut (le nombre actuel de fichiers de ma boite fedora 15) ayant ce que je crois être un résultat étonnant:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Juste au cas où vous voudriez faire une comparaison avec la du -sb /commande, elle affichera une estimation de l'utilisation du disque en octets ( -boption)

# du -sb /
12684646920 /

Comme je m'y attendais, il est un peu plus grand que mon calcul de commande car l' duutilitaire renvoie l'espace alloué de chaque fichier et non l'espace réellement consommé.

[version initiale]
Vous ne pouvez pas utiliser la ducommande si vous avez besoin de connaître la taille de somme exacte de votre dossier car (comme indiqué dans la citation de la page de manuel) duestime l'utilisation de l'espace fichier. Par conséquent, cela vous mènera à un résultat erroné, une approximation (peut-être proche de la taille de la somme mais très probablement supérieure à la taille réelle que vous recherchez).

Je pense qu'il peut y avoir différentes façons de répondre à votre question, mais c'est la mienne:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Il trouve tous les fichiers sous. répertoire (changez avec le répertoire que vous voulez), les fichiers cachés sont également inclus et (en utilisant xargs) affiche leurs noms sur une seule ligne, puis produit une liste détaillée en utilisant ls -l. Cette sortie (parfois) énorme est redirigée vers la commande cut et seul le cinquième champ ( -f5), qui est la taille du fichier en octets, est repris et redirigé vers xargsce qui produit à nouveau une seule ligne de tailles séparées par des blancs. Maintenant a lieu une magie sed qui remplace chaque espace vide par un signe plus ( +) et enfin bc(calculatrice de base) fait le calcul.

Il peut avoir besoin d'un réglage supplémentaire et vous pouvez avoir une lscommande se plaignant de la liste d'arguments trop longue.


si le répertoire est trop volumineux, il se bloque pendant longtemps, essayez de travailler sur votre répertoire personnel: p
Kit Ho

@KitHo eh bien, j'ai peur qu'il n'y ait pas de moyen facile et rapide d'obtenir un résultat précis sans rechercher chaque fichier et ajouter sa taille, donc la paresse des commandes dépend principalement du nombre de fichiers sous le répertoire recherché ... Mais je crois qu'il y a c'est une marge d'améliorations ... beau challenge!
ztank1013

@KitHo hé là, jetez un œil à la version améliorée dans ma réponse ... et faites-le moi savoir bien sûr!
ztank1013

0

Une autre solution simple.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

le résultat ressemblera à

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

changer "du -s" en "du -sh" affichera une taille lisible par l'homme, mais nous ne pourrons pas trier dans cette méthode.


0

vous pouvez utiliser ce qui suit pour lister les fichiers par taille du -h | sort -hr | plus ou du -h --max-depth = 0 * | sort -hr | plus


0

J'ai tendance à utiliser du de manière simple.

du -sh */ | sort -n

Cela me donne une idée des répertoires qui consomment le plus d'espace. Je peux ensuite exécuter des recherches plus précises plus tard.


Ce genre de travail, mais ignore les unités sur la taille du fichier lors du tri.
Benjamin Engwall
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.