Si vous êtes sûr que les noms de répertoires ne contiennent pas d'espaces, il est simple d'obtenir tous les noms de répertoires sur une seule ligne :
du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
Obtenir les informations en python
Si vous souhaitez capturer cette sortie dans un programme python et en faire une liste. Utilisation de python2.7 ou supérieur :
import subprocess
dir_list = subprocess.check_output("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True).split()
En python2.6 :
import subprocess
subprocess.Popen("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True, stdout=subprocess.PIPE).communicate()[0].split()
Nous pouvons également tirer parti des fonctionnalités de python pour réduire la quantité de travail effectué par le shell et, en particulier, pour éliminer le besoin de awk
:
subprocess.Popen("du -sk [a-z]*/ | sort -nr", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split()[1::2]
On pourrait aller plus loin et lire le du
sortie directement en python, convertir les tailles en nombres entiers et trier sur la taille. Il est cependant plus simple de le faire avec sort -nr
dans le shell.
Spécifier un répertoire
Si les répertoires dont vous voulez la taille ne sont pas dans le répertoire en cours, il y a deux possibilités :
du -sk /some/path/[a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
et aussi :
cd /some/path/ && du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
La différence entre ces deux est de savoir si /some/path
est inclus ou non dans la sortie.
Utilisation de paste
du -sk [a-z]* 2>/dev/null | sort -nr| cut -f2- | paste -s -
zsh
a la capacité de trier ses globs en utilisant des qualificateurs de globbing. Vous pouvez également définir vos propres qualificateurs glob avec des fonctions. Par exemple :
zdu() REPLY=$(du -s -- "$REPLY")
print -r -- [[:alpha:]]*(/nO+zdu)
imprimerait les répertoires (/
) dont le nom commence par une lettre (au fait, [a-z]
n'a de sens que dans les paramètres régionaux C) numériquement (n) trié à l'envers (O) en utilisant le zdu
fonction.
Notez que lorsque vous le faites :
du -s a b
Si a
et b
contiennent des liens physiques vers les mêmes fichiers, leur utilisation du disque sera comptée pour a
mais pas pour b
. Le zsh
approche ici évite cela.
Si vous allez utiliser python, je ferais la même chose à partir de là :appelez du -s
pour chacun des fichiers, et triez cette liste ici. N'oubliez pas que les noms de fichiers peuvent contenir n'importe quel caractère, y compris l'espace, la tabulation et la nouvelle ligne.