Il comando du è uno standard Linux/Unix (e Mac) che ci permette di ottenere informazioni su file e cartelle in modo molto rapido.
Come la maggior parte dei comandi, ha molti opzioni e flag per ottenere l’output che ci interessa davvero. In questo articolo vedremo gli usi basilari e anche qualche flag interessante che può velocizzarci il lavoro.
Partiamo dal comando base, nudo e crudo, senza opzioni:
luca$ du 56 ./database/migrations 8 ./database/seeders 8 ./database/factories 96 ./database 56 ./bootstrap/cache 64 ./bootstrap ... 32498 /devdev
Vediamo qualche riga di output date dal comando base. Il valore sulla sinistra (56, 8, etc.) indica il peso della directory e accanto, naturalmente, la directory. L’ultima riga, ci ripropone la directory iniziale /devdev con la somma dei pesi, e serve da “riassunto” di tutte le directory contenuta in esse. Non c’è indicazione dell’unità di misura (56..cosa?): diamo uno sguardo alle opzioni per ottenere un output più umano.
-h, –human-readable
Il flag -h rende gli output che indicano il peso delle directory in un formato human-readable, espresso in Bytes/Kilobytes. Se rilanciamo il comando dh -h sulla directory precedente, otterremo qualcosa del genere, con le dimensioni espresse in Kilo/Mega/Gigabytes:
luca$ du -h 12K ./database/migrations 4K ./database/seeders 4K ./database/factories
-s, –summarize
Il flag -s è ideale da usare soprattutto in congiunzione con quello -h. Combinando i loro poteri, otterremo il peso complessivo di una directory espresso in formato umano:
luca$ du -sh 126K /devdev/
Il formato di questo output è naturalmente identico a quello di -h.
-a, –all
C’era da aspettarselo: come suggerisce il nome, il flag -a mostrerà non sono le directory, ma anche tutti i file contenuti in esse. In combinazione con -h, otterremo qualcosa del genere
luca$ du -ah 12K ./database/migrations >4K ./database/seeders 1K ./database/seeders/Seeder.php 4K ./database/factories
–time
Questo flag mostra la data di ultima modifica di file e directory. Potrebbe essere particolarmente utile per capire in quale directory un utente ha lavorato oppure quale file è stato cambiato. Eccolo in congiunzione con -ah:
luca$ du -ah --time 1K 2024-01-07 11:30 ./database/seeders/Seeder.php 1K 2024-01-07 16:48 ./database/connectors 4K 2024-01-07 11:34 ./database/migrations
Ordinare per dimensione
Per ordinare i risultati per dimensione, dobbiamo utilizzare il comando du in combinazione con il comando sort. Nella sua forma più semplice, potremmo fare questo:
luca$ du -h /devdev | sort -rh 45M /db 32M /seeders 3M /helpers 1M /classes 1M /users 50K /license
Abbiamo usato le opzioni -r e -h per il comando sort. L’opzione -r dice a sort di rovesciare l’output di du, in modo da mostrare i risultati in modo discendente, dal più pesante al più leggero. L’opzione -h, invece, è tutto analoga a quella di du -h, e serve per avere i pesi in formato umano.
Trovare i 5 file più grandi
Per trovare i 5 file più grandi in una directory, possiamo “tagliare” i risultati del precedente comando, utilizzando il comando head:
luca$ du -h /devdev | sort -rh | head -n 10 45M /db 32M /seeders 3M /helpers 1M /classes 1M /users
Specificare la profondità di ricerca
Di default, il comando du itera tutte le sottodirectory delle sottodirectory delle sottodirectory.. insomma avete capito. Questa ricorsività può essere controllata, dicendo a du di “scendere” al massimo di n livelli di sottocartelle. Per farlo, è sufficiente utilizzare l’opzione --max--depth come in questo caso, nel quale il listing si fermerà al secondo livello:
du -h --max-depth=2 /devdev | sort -rh
Specificare il tipo di file
Se volessimo, ad esempio, cercare tutti i file di tipo .mkv, magari ordinandoli per dimensione per capire cosa ci intasa il disco, possiamo utilizzare il comando du in questo modo:
du -h /filmazzi/*.mkv | sort -rh 5.0G /filmazzi/Il.risveglio.della.forza.mkv 4.8G /filmazzi/Il.ritorno.dello.jedi.mkv 4.4G /filmazzi/L.Impero.colpisce.ancora.mkv