Conoscere lo spazio su disco occupato da un file o una directory in Linux: il comando du e le sue opzioni
Il comando "du" (Disk Usage) è un comando Linux utilizzato per conoscere le dimensioni occupate su disco dalle directories, dalle loro sotto directories, e dai files.
E' quindi molto utile per rintracciare directories e files che consumano grandi quantità di spazio su un'unità disco rigido (HDD) o altri supporti di memorizzazione (ad esempio USB).
Ogni computer è caratterizzato da una alberatura di directories "parent" e sottodirectories "children" . Possiamo utilizzare "du" in qualunque directory, per ottenere informazioni relative allo spazio occupato da questa directory e dalle sue sottodirecory.
Le directory che occupano molto spazio o che saturano la capienza del disco, possono rallentare il sistema, impedire agli utenti di accedere e persino provocare un arresto anomalo del sistema. Quindi è importante monitorare costantenemente l'utilizzo del disco.
Il comando "du" ha molte opzioni, che, combinate tra loro, consentono di visualizzare le informazioni effettivamente necessarie e nel formato più adeguato.
L'unico difetto, se così possiamo chiamarlo, di "du" è che i dati visualizzati relativi alle dimensioni delle directory e dei file sono delle approssimazioni, e non dei numeri esatti, e quindi può esserci una piccola discrepanza tra le informazioni ottenute con "du" e le dimensioni riportate da altri comandi, come ad esempio "df". Tuttavia, questo difetto non limita la sua utilità.
In questo articolo vediamo alcuni esempi di suo utilizzo.
Visualizzo lo spazio occupato da una directory e dalle sue sottodirectories.
Se vogliamo conoscere lo spazio disco utilizzato da un directory (parent) e da tutte le sue sottodirectory (children), utilizziamo il comando "du" seguto dal parent directory oggetto della nostra analisi.
Ad esempio se la directory di nostro interesse è "/home/pippo", l'output mostrerà il numero di blocchi del disco nella directory /home/pippo e le sue sottodirectory.
# du /home/pippo
4 /home/pippo/.mozilla/extensions
4 /home/pippo/.mozilla/plugins
12 /home/pippo/.mozilla
1748 /home/pippo
Visualizzo l'output in un formato più leggibile
Utilizzando l'opzion "-h", il comando "du" visualizzerà l'utilizzo disco in un formato più leggibile, cioè in Bytes, Kilobytes, Megabytes, Gigabytes, ....
# du -h /home/pippo
4.0K /home/pippo/.mozilla/extensions
4.0K /home/pippo/.mozilla/plugins
12K /home/pippo/.mozilla
1.8M /home/pippo
Se vogliamo visualizzare l'output solamente in Megabyte utilizziamo l'opzione "-B" (oppure "--block-size") seguita da "M" cioè Megabyte
# du -B M /home/pippo
1M /home/pippo/.mozilla/extensions
1M /home/pippo/.mozilla/plugins
1M /home/pippo/.mozilla
2M /home/pippo
In modo analogo possiamo visualizzare i dati nelle altre unità di misura: K per Kilobytes, M per Megabytes, G per Gigabytes, T per Terabytes, ...
Visualizzo il totale generale di utilizzo di spazio disco
Per aggiungere alla fine della lista una riga con il totale generale, utilizziamo l'opzione "-c" (che non sarà altro che lo spazio occupato dalla directory parent)
# du -hc /home/pippo
4.0K /home/pippo/.mozilla/extensions
4.0K /home/pippo/.mozilla/plugins
12K /home/pippo/.mozilla
1.8M /home/john
1.8M total
Visualizzo lo spazio occupato dalla sola directory parent
Se siamo interessato alla sola directory "home/pippo" senza le sue sottodirectory utilizziamo l'opzione "-s", che utilizziamo in abbinamento a "-h" per ottenere un formato più leggibile
# du -sh /home/pippo
1.8M /home/pippo
Visualizzo lo spazio occupato anche dai files
Se siamo interessati utilizzo del disco non solo delle directories ma anche dei files, utilizziamo l'opzione "-a" (oppure "--all"), che utilizziamo in abbinamento a "-h" per ottenere un formato più leggibile
# du -ah /home/pippo
4.0K /home/john/prova1.txt
4.0K /home/john/prova2.txt
1.8M /home/john/IMG_20171021_153221.jpg
4.0K /home/pippo/.bash_profile
4.0K /home/pippo/.bash_logout
4.0K /home/pippo/.mozilla/extensions
4.0K /home/pippo/.mozilla/plugins
12K /home/pippo/.mozilla
4.0K /home/pippo/.bashrc
1.8M /home/pippo
Visualizzo l'utilizzo disco escludendo specifici files
Se dalla nostra visualizzazione vogliamo escludere specifici files, ad esempio files con una determinata estensione, utilizziamo l'opzione "-- exclude".
Ad esempio, se vogliamo escludere i files ".txt" utilizziamo l'opzione --exclude="*.txt" dove l'asterisco è una "wildcars" ed è equivalente a "tutti i files con estensione .txt"
# du -ah --exclude="*.txt" /home/pippo
1.8M /home/pippo/IMG_20171021_153221.jpg
4.0K /home/pippo/.bash_profile
4.0K /home/pippo/.bash_logout
4.0K /home/pippo/.mozilla/extensions
4.0K /home/pippo/.mozilla/plugins
12K /home/pippo/.mozilla
4.0K /home/pippo/.bashrc
1.8M /home/pippo
Visualizzo l'utilizzo del disco in base alla data di modifica di files e directories
Se siamo anche interessati alla data di modifica dei files e directories utilizziamo l'opzione "-time"
# du -ah --time /home/pippo
4.0K 2018-02-28 07:56 /home/pippo/prova1.txt
4.0K 2018-02-28 07:57 /home/pippo/prova2.txt
1.8M 2017-10-21 14:32 /home/pippo/IMG_20171021_153221.jpg
4.0K 2014-09-25 22:25 /home/pippo/.bash_profile
4.0K 2014-09-25 22:25 /home/pippo/.bash_logout
4.0K 2013-02-16 12:57 /home/pippo/.mozilla/extensions
4.0K 2013-02-16 12:57 /home/pippo/.mozilla/plugins
12K 2013-06-27 19:19 /home/pippo/.mozilla
4.0K 2014-09-25 22:25 /home/pippo/.bashrc
1.8M 2018-02-28 08:52 /home/pippo
Limito il livello di profondità delle analisi
Un'altra opzione utile è "--max-depth", che consente di limitare la ricerca, in un albero di directories, al livello di profondità desiderato (cioè al livello di sottodirectory desiderato).
Ad esempio, per limitarci al primo livello di sottodirectory, usiamo --max-depth = 1
# du -h --max-dept=1 /home/pippo
12K /home/pippo/.mozilla
1.8M /home/pippo
L'impostazione --max-depth = 0 è equivalente all'utilizzo dell'opzione "-s" cioè ci limitiamo alla directory parent senza visualizzare directory children.
Utilizzo con filtri
Come nel caso di altri comandi in Linux, du può essere collegato, atrraverso l'utilizzo di un pipe (la stanghetta |), a filtri per rendere ancora più utili i dati ottenuti.
Ad esempio, per disporre gli elementi di output in base alla loro dimensione, du possiamo utilizzare il pipe per reindirizzare l'output al comando sort con l'opzione "-n" che serve a ordinare l'output utilizzando come criterio di ordinamento i valori numerici (quindi il peso)
# du -ha /home/pippo | sort -n
1.8M /home/pippo
1.8M /home/pippo/IMG_20171021_153221.jpg
4.0K /home/pippo/.bash_logout
4.0K /home/pippo/.bash_profile
4.0K /home/pippo/.bashrc
4.0K /home/pippo/.mozilla/extensions
4.0K /home/pippo/.mozilla/plugins
4.0K /home/pippo/prova1.txt
4.0K /home/pippo/prova2.txt
12K /home/pippo/.mozilla
Capita spesso che l'ouput sia molto lungo e quindi scorre velocemente rendendolo praticamente illeggibile. Possiamo utilizzare in questi casi il filtro "less" che consente di visualizzare l'output con una schermata alla volta.
# du -h /home/pippo | less
L'output ottenuto tramite less può essere avanzato di una schermata alla volta premendo la barra spaziatrice, o riga per riga usando le frecce up e down, e può essere spostato all'indietro di una schermata alla volta premendo il tasto b. Per uscire dalla schermate utilizzare la lettera q della tastier ("quite").
E anche possibile prendere il risultato e filtrarlo nuovamente, cioè utlizzare più pipe. Ad esempio se vogliamo ordinare per dimensione e poi, dopo l'ordinamento, mostrare una schermata alla volta utilizziamo i filtri in modo concatenato così:
# du -h /home/pippo | sort -n | less
Tra i filtri molto in uso esiste il filtro "grep" ed è utilizzato per cercare una certa stringa nell'ouput ottenuto da "du"
Ad esempio se ci interessano solo le linee di output che contengono la stringa "prova":
# du -ha /home/pippo | grep prova
4.0K /home/pippo/prova1.txt
4.0K /home/pippo/prova2.txt
As esempio, se mi interessano le linee di output che presentano la lettera maiuscola M
# du -ha /home/pippo | grep M
1.8M /home/pippo/IMG_20171021_153221.jpg
1.8M /home/pippo
Individuo le directory e i files più capienti
Per la gestione del nostro server Linux spesso è necessario indi individuare files e directories che occupano più spazio sul nostro disco.
Nel nostro esempio ci interessa la directory /var/www/html del nostro sistema.
Utilizziamo "du" e ordiniamo l'output ottenuto per peso decrescente (dal maggiore al minore) utilizzando sort con l'opzioni "-n", già visto in precedenza, e "-r" che ordina in modo decrescente, quindi dal peso più grande al più piccolo
Passiamo l'ouput ottenuto al comando head che ci consente di limitare il numero di righe da visualizzare, ad esempio 10 righe
# du -ha B M /var/www/html | sort -n -r | head -n 10
1020K /var/www/html/contents/8/289
1020K /var/www/html/contents/4/32600.mp4
1020K /var/www/html/contents/4/15966.mp4
1020K /var/www/html/contents/4/15148.mp4
1020K /var/www/html/contents/1/850.jpg
1016K /var/www/html/sito1/folders/landing/53
1016K /var/www/html/contents/4/framevideo/38637
1016K /var/www/html/contents/4/framevideo/38629
1016K /var/www/html/contents/4/32606.mp4
1016K /var/www/html/contents/4/17354.mp4
Il manuale del comando du
Per conoscere tutte le opzioni del comando "du" utilizziamo il classico "--help"
# du --help
Usage: du [OPTION]... [FILE]...
or: du [OPTION]... --files0-from=F
Summarize disk usage of each FILE, recursively for directories.
Mandatory arguments to long options are mandatory for short options too.
-0, --null end each output line with 0 byte rather than newline
-a, --all write counts for all files, not just directories
--apparent-size print apparent sizes, rather than disk usage; although
the apparent size is usually smaller, it may be
larger due to holes in ('sparse') files, internal
fragmentation, indirect blocks, and the like
-B, --block-size=SIZE scale sizes by SIZE before printing them. E.g.,
'-BM' prints sizes in units of 1,048,576 bytes.
See SIZE format below.
-b, --bytes equivalent to '--apparent-size --block-size=1'
-c, --total produce a grand total
-D, --dereference-args dereference only symlinks that are listed on the
command line
-d, --max-depth=N print the total for a directory (or file, with --all)
only if it is N or fewer levels below the command
line argument; --max-depth=0 is the same as
--summarize
--files0-from=F summarize disk usage of the NUL-terminated file
names specified in file F;
If F is - then read names from standard input
-H equivalent to --dereference-args (-D)
-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)
-k like --block-size=1K
-L, --dereference dereference all symbolic links
-l, --count-links count sizes many times if hard linked
-m like --block-size=1M
-P, --no-dereference don't follow any symbolic links (this is the default)
-S, --separate-dirs do not include size of subdirectories
--si like -h, but use powers of 1000 not 1024
-s, --summarize display only a total for each argument
-t, --threshold=SIZE exclude entries smaller than SIZE if positive,
or entries greater than SIZE if negative
--time show time of the last modification of any file in the
directory, or any of its subdirectories
--time=WORD show time as WORD instead of modification time:
atime, access, use, ctime or status
--time-style=STYLE show times using style STYLE:
full-iso, long-iso, iso, +FORMAT
FORMAT is interpreted like 'date'
-X, --exclude-from=FILE exclude files that match any pattern in FILE
--exclude=PATTERN exclude files that match PATTERN
-x, --one-file-system skip directories on different file systems
--help display this help and exit
--version output version information and exit
Display values are in units of the first available SIZE from --block-size,
and the DU_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE environment variables.
Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set).
SIZE is an integer and optional unit (example: 10M is 10*1024*1024). Units
are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
Report du bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
For complete documentation, run: info coreutils 'du invocation'
You have new mail in /var/spool/mail/root