Comment obtenir la taille d'un répertoire Linux ou Mac OS X à partir de la ligne de commande? [dupliquer]


74

Cette question a déjà une réponse ici:

Quelle commande est-ce que j'utilise pour trouver la taille de tous les fichiers (de manière récursive) dans un répertoire Linux ou Mac OS X?


2
vous pouvez utiliser l' -koption d'utiliser la taille de bloc de 1
Ko

Je veux juste recommander ce logiciel gratuit appelé Disk Inventory X. Téléchargez-le ici derlien.com il est simple à utiliser pour mac osx
Nimitack

Au lieu de du, j'utilise ncdu, vous pouvez trouver la référence ici, remysharp.com/2018/08/23/cli-improved
Alan Dong

Réponses:


82

La version BSD de duutilisée dans OS X rapports taille avec des blocs de 512 octets - les tailles sont essentiellement arrondies à la valeur suivante 512 octets. Cela vous indique l'espace sur le disque, qui est plus grand que la quantité de données. Si vous avez beaucoup de petits fichiers, la différence peut être grande.

Voici un exemple.

C'est la valeur avec regular du. C'est par blocs de 512 octets:

$ du -s
248   .

L' -hindicateur génère un nombre plus lisible, en kilo-octets. Comme prévu, il s'agit de la moitié du nombre de blocs de 512 octets:

$ du -hs
124K  .

Enfin, vous pouvez utiliser findet awkvous donner la somme des octets réels dans les fichiers. C'est un peu lent, mais ça marche:

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

Cette valeur correspond exactement au nombre indiqué par la fenêtre Obtenir des informations du Finder. (Il n'y a pas de forks ou xattrs étranges dans cet ensemble de fichiers.) Il est nettement inférieur à la valeur indiquée par du.

Voici comment cela fonctionne: il obtient une liste de tous les fichiers et les transmet à ls -l; puis awkest utilisé pour compter les octets. Le -type fdrapeau est là pour que seuls les fichiers (et non les répertoires) soient envoyés à ls. Sans cet indicateur, il enverra également les noms de répertoire à ls, et chaque fichier sera répertorié deux fois: une fois en tant que fichier individuel et une fois en tant qu'élément du répertoire.

La version GNU de dupeut donner des valeurs en octets réels au lieu de blocs. Il est regrettable que la version BSD de dune soit pas aussi flexible.


Grande explication. Fait intéressant, lorsque j'utilise duGNU coreutils avec l' -boption, le résultat est différent de celui obtenu avec votre findpipe. Pour un répertoire de 36 Go, la différence est de 82 Ko.
Stefan Schmidt

Est-il possible d'imprimer cela dans un format plus lisible par l'homme?
anon58192932

75

Afficher la taille d'un seul fichier

du -h path_to_a_file

Affiche la taille du contenu d'un répertoire, de chaque sous-répertoire et de chaque fichier:

du -h path_to_a_directory

Affiche la taille du contenu d'un répertoire:

du -sh path_to_a_directory


25
du -schsi vous voulez quelque chose de plus facile à lire.
Joey

@Johannes, je suppose que vous devriez poster ce commentaire comme réponse, afin qu'il puisse être accepté?
Arjan

Je trouve l’option -c redondante (du moins sur Mac OS X) et du -sh supprime les sous-totaux.
Daryl Spitzer

Aha, je ne savais pas qu'on pouvait accepter sa propre réponse. Maintenant au moins les gens savent que la question est résolue.
Arjan

Je vais accepter avec joie une nouvelle réponse qui constitue une amélioration par rapport à la mienne.
Daryl Spitzer

9

du - indique à l’ utilisation du disque et non à la taille du fichier .

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

ci-dessus, le code terminal (im sur osx 10.6) offre pour moi le meilleur résultat et est plus rapide que "find ... -exec"

un repère rapide

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s

Si vous voulez faire la même chose sur Ubuntu:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo

Existe-t-il un moyen d'obtenir ce résultat dans un format lisible par l'homme?
anon58192932

6

Vous pouvez utiliser du -ah .les tailles d'affichage de tous les fichiers et répertoires de manière récursive.

Ceci peut être combiné avec sort, ainsi vous verrez les 20 plus grands répertoires du dossier actuel:

du -ah . | sort -rh | head -20

Remarque: l' option -hpour sortn'est pas disponible sur Mac OS X / BSD, de sorte que vous avez à installer à sortpartir coreutils(par exemple via brew) et appliquer le chemin du bac à PATH, par exemple ,

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Sinon, utilisez:

du -a . | sort -rn | head -20

La première commande ne fonctionne pas sur mon macOS 10.12.1 #du -ah. | trier -rh | head -20 sort: option non valide - h Essayez `sort --help 'pour plus d'informations.
Nucleartux

3
@nucleartux Vérifiez la note sous la commande. Cela fonctionne dans le tri GNU que vous pouvez installer sur macOS via:, brew install coreutilssinon utilisez la commande de tri BSD à la fin sans -h.
Kenorb

2

J'ai combiné toutes vos approuches et combiné avec une sortie lisible par l'homme le résultat est:

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

Lien vers l'essentiel: https://gist.github.com/mlegenhausen/9365461

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.