Il controllo dell'occupazione del disco

«Mi hanno detto che occupo troppo spazio su disco... ma come posso fare per sapere cosa devo cancellare?»

Per sapere cosa cancellare, può essere utile il comando

du -sk nome1 nome2 ...
dove du sta per "disk usage", -s indica al comando di sommare tutte le dimensioni degli oggetti contenuti in nomen (questa opzione serve in particolare quando l'oggetto esaminato è una directory), e infine -k indica al comando di rappresentare il risultato, occupazione di nomen, in termini di kilobyte. Un esempio di utilizzo:
% du -sk ardea.tex Word
36 ardea.tex
52037 Word
%
si può vedere che il file ardea.tex occupa 36 kilobyte, mentre la directory Word occupa, insiema a tutto il proprio contenuto,  oltre 52 megabyte.

Automatizzare il comando du

Naturalmente possiamo combinare insieme diversi comandi (qui sta la caratteristica di *nix) per ottenere un risultato più semplice da utilizzare. Innanzitutto, vogliamo passare al comando du una lista di oggetti del file system che comprenda tutti i file e tutte le directory presenti nella directory corrente.  Usando il comando
% du -s *
otteniamo qualcosa di simile a quanto desideriamo, ma la shell sostituisce alla wildcard * soltanto i file non-invisibili, mentre noi vorremmo vedere tutti i file/directory presenti, compresi quelli invisibili. Sapendo che, per convenzione, i file invisibili hanno nome preceduto dal carattere ".", proviamo il comando
% du -s * .*
In questo caso, oltre ai file/directory invisibili, abbiamo qualcosa di più, ovvero il risultato relativo alla directory corrente, che in *nix è designata convenzionalmente dal nome ".", e fin qui poco male, ma anche il risultato relativo alla directory parente della dirextory corrente, convenzionalmente denominata "..", e questo è un risultato indesiderato, perché la directory parente della mia home directory contiene le home directory di tutti gli utenti, ed esaminare tutte le home directory per calcolarne l'occupazione totale è pesantissimo per l'unità disco, per la rete e per la workstation locale, ed è, soprattutto, inutile.

Inserire il risultato di un comando sulla linea di comando

C'è un comando che restituisce una lista di file che contiene esattamente tutti i file/directory della directory corrente, tranne la directory corrente e la parente: "ls -A". Si potrebbe eseguire il comando e poi fare un cut&paste del risultato, ma questa procedura è inutilmente laboriosa, in quanto esiste una sintassi che ci consente di sostituire, in una linea di comando, il risultato dell'invocazione di un altro comando, introdotta dal simbolo $( seguito dal comando richiesto, e terminata dal simbolo ). Nel nostro caso, digiteremo
% du -sk $(ls -A)

Passare il risultato di un comando all'input di un secondo comando

La lista di coppie occupazione-nome che otteniamo non è peraltro ordinata in alcun modo intelleggibile agli umani,
mentre a noi servirebbe una lista che contenga le maggiori occupazioni verso la fine, in modo da poterle immediatamente riconoscere. Fortunatamente *nix offre il comando sort, che legge una sequenza di linee di testo e le ordina secondo un criterio che può essere modificato specificando delle opzioni sulla linea di comando. Anche qui abbiamo una alternativa sintattica al cut&paste, il simbolo "|", che prende l'output del comando alla sua sinistra e lo passa al comando alla sua destra:
% du -sk $(ls -A) | sort -n

L'opzione -n indica a sort di ordinare numericamente in ordine crescente le linee di input, e quindi il risultato di questo ultima linea di comando è una lista di coppie occupazione-nome ordinata secondo l'occupazione, con le occupazioni maggiori in fondo alla lista, ovvero davanti ai vostri occhi...

Esattamente quanto desideravamo!

Una variazione sul tema

Proponiamo infine una variazione sul tema:
ls -A | while read f ; do du -sxk "$f" ; done | sort -n
che rispetto alla versione precedente opera correttamente anche con nomi che contengono degli spazi.  Secondo voi, perché questa versione funziona e l'altra no?

Conclusione

La procedura da seguire per individuare le zone grasse del disco consiste nel selezionare la propria home directory, eseguire:
ls -A | while read f ; do du -sxk "$f" ; done | sort -n
e identificare la directory più cospicua, selezionarla, rieseguire il comando, identificare i file e le directory più cospicue, decidere cosa rimuovere e cosa tenere, ritornare alla home o scendere di livello a seconda della situazione, rieseguire il comando, etc etc, fino a raggiunta soddisfazione...