web-dev-qa-db-fra.com

Comment puis-je lister (récursivement) la taille de chaque fichier et répertoire et trier par taille en ordre décroissant dans Bash?

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

Je veux que lorsque je tape ls -<some options>, il puisse lister de manière récursive 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?

103
Kit Ho

Il suffit de naviguer dans le répertoire et d'exécuter la commande suivante:

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

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

du -a -h --max-depth=1 | sort -hr
207
Developer
du -s -- * | sort -n

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

Utilisez du -sm pour les unités Mb, etc. J'utilise toujours

du -smc -- * | sort -n

parce que la ligne totale (-c) se retrouvera au bas pour des raisons évidentes :)

PS:

  • Voir les commentaires pour la gestion des fichiers de points
  • J'utilise fréquemment par exemple 'du -smc/home// | triez -n | tail 'pour avoir une idée de l'endroit où sont assis les gros morceaux
18
sehe

Apparemment, l'option --max-depth ne figure pas dans la version de Mac OS X de la commande du. Vous pouvez utiliser ce qui suit à la place.

du -h -d 1 | sort -n

15
cevaris

Commander

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

Sortie

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 sorte et en du)
  • max-depth=0 signifie que du n'indiquera pas la taille des sous-dossiers (supprimez-le si vous voulez afficher toutes les tailles de chaque fichier dans chaque sous-, sous-dossier, ..., dossier)
  • r est pour "reverse" (le plus grand fichier en premier)

ncdu

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

Installation sur Ubuntu:

$ Sudo apt-get install ncdu

Usage:

Il suffit de taper ncdu [path] dans 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 en surbrillance avec d, sortir avec CTRL + c

12
Martin Thoma

ls -S trie par taille. Ensuite, pour afficher également la taille, ls -lS donne un affichage long (-l), trié par taille (-S). J'ajoute généralement aussi -h pour faciliter la lecture, donc ls -lhS.

4
Thanatos

Simple et rapide:

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

* nécessite GNU parallèle .

1
pje

Je pense que j'aurais 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ée par taille de fichier et par 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
0
dvorak

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

du -sh */ | sort -n

Cela me donne une idée de ce que les répertoires consomment le plus d'espace. Je peux alors lancer des recherches plus précises plus tard.

0
Pace

[version améliorée]
Cela sera beaucoup plus rapide et précis que la version initiale ci-dessous et générera la somme de toute la taille du fichier du répertoire en cours. :

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

la commande stat -c %s sur un fichier retournera sa taille en octets. La commande tr est utilisée ici pour surmonter les limitations de la commande xargs (apparemment, canaliser vers xargs divise les résultats sur plusieurs lignes, rompant ainsi la logique de ma commande). Ainsi, tr prend soin de remplacer le saut de ligne par le signe + (plus). sed a pour seul objectif de supprimer le dernier signe + de la chaîne résultante pour éviter les plaintes de la dernière commande 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 Fedora 15) ayant ce que je considère comme 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 commande du -sb /, l’utilisation estimée du disque en octets (option -b)

# du -sb /
12684646920 /

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

[version initiale]
Vous ne pouvez pas utiliser la commande du si vous devez connaître la taille de la somme exacte de votre dossier car (selon la citation de la page de manuel) du estime l'utilisation de l'espace des fichiers. Par conséquent, cela vous mènera à un résultat erroné, une approximation (peut-être proche de la taille de la somme, mais probablement supérieure à la taille réelle que vous recherchez).

Je pense qu'il y a différentes façons de répondre à votre question, mais celle-ci est la mienne:

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

Il trouve tous les fichiers sous. directory (change. avec le répertoire de votre choix), les fichiers cachés sont également inclus et (en utilisant xargs) affiche leur nom sur une seule ligne, puis produit une liste détaillée en utilisant ls -l. Cette sortie (parfois) énorme est dirigée vers la commande de coupe et seul le cinquième champ (-f5), qui correspond à la taille du fichier en octets, est à nouveau acheminé contre xargs, ce qui produit à nouveau une seule ligne de tailles. séparés par des blancs. Maintenant, placez une magie sed qui remplace chaque espace vide par un signe plus (+) et enfin bc (calculatrice de base) fait le calcul.

Cela peut nécessiter un réglage supplémentaire et vous pouvez avoir la commande ls se plaindre de la liste des arguments trop longtemps.

0
ztank1013

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 cette méthode.

0
Ambal

vous pouvez utiliser ci-dessous pour lister les fichiers par taille du -h | trier -hr | plus ou du -h --max-depth = 0 * | trier -hr | plus

0
Ghassan Shawahneh