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?
La version BSD de du
utilisée dans OS X indique la taille avec des blocs de 512 octets - les tailles sont essentiellement arrondies à la valeur suivante de 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 du
régulier. C'est par blocs de 512 octets:
$ du -s
248 .
L'indicateur -h
donne 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 find
et awk
pour vous 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 de 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
; alors awk
est utilisé pour compter les octets. L’indicateur -type f
existe afin 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 du
peut donner des valeurs en octets réels au lieu de blocs. Il est regrettable que la version BSD de du
ne soit pas aussi flexible.
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
du - indique l'utilisation du disquepas le 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
Vous pouvez utiliser du -ah .
qui affiche la taille 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 -h
pour sort
n'est pas disponible sous OSX/BSD. Vous devez donc installer sort
à partir de coreutils
(par exemple via brew
) et appliquer le chemin d'accès à 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
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 le Gist: https://Gist.github.com/mlegenhausen/9365461