Se sei sicuro che i nomi delle directory non contengano spazi bianchi, allora è semplice ottenere tutti i nomi delle directory su una riga:
du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
Ottenere le informazioni in Python
Se vuoi catturare quell'output in un programma Python e trasformarlo in un elenco. Usando python2.7 o superiore:
import subprocess
dir_list = subprocess.check_output("du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2\" \"}'", shell=True).split()
In 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()
Possiamo anche sfruttare le funzionalità di Python per ridurre la quantità di lavoro svolto dalla shell e, in particolare, per eliminare la necessità di awk
:
subprocess.Popen("du -sk [a-z]*/ | sort -nr", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].split()[1::2]
Si potrebbe andare oltre e leggere il du
output direttamente in python, convertire le dimensioni in numeri interi e ordinare in base alle dimensioni. È più semplice, però, farlo solo con sort -nr
nella shell.
Specificare una directory
Se le directory di cui vuoi la dimensione non sono nella directory corrente, ci sono due possibilità:
du -sk /some/path/[a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
e anche:
cd /some/path/ && du -sk [a-z]*/ 2>/dev/null | sort -nr | awk '{printf $2" "}'
La differenza tra questi due è se /some/path
è incluso o meno nell'output.
Usando paste
du -sk [a-z]* 2>/dev/null | sort -nr| cut -f2- | paste -s -
zsh
ha la capacità di ordinare i suoi glob usando i qualificatori globbing. Puoi anche definire i tuoi qualificatori glob con le funzioni. Ad esempio:
zdu() REPLY=$(du -s -- "$REPLY")
print -r -- [[:alpha:]]*(/nO+zdu)
stampa le directory (/
) il cui nome inizia con una lettera (btw, [a-z]
ha senso solo nella versione locale C) numericamente (n) ordinamento inverso (O) usando zdu
funzione.
Nota che quando lo fai:
du -s a b
Se a
e b
contengono collegamenti fisici agli stessi file, il loro utilizzo del disco verrà conteggiato per a
ma non per b
. Il zsh
approccio qui lo evita.
Se hai intenzione di usare Python, farei lo stesso da lì:chiama du -s
per ciascuno dei file e ordina l'elenco lì. Ricorda che i nomi dei file possono contenere qualsiasi carattere inclusi spazio, tabulazione e newline.