Linux / Comando du: misurare lo spazio di file e directory

du calcola lo spazio occupato da file e directory sul filesystem. Per vedere i totali delle directory immediatamente sottostanti usa du -h --max-depth=1 .; per il solo totale della directory corrente usa du -sh .. Gli esempi si riferiscono a GNU Coreutils su Linux: sostituisci percorsi come /var, ./data e file1 con quelli da esaminare, senza modificare i dati.

du -h --max-depth=1 .
du -sh .

Il valore predefinito riguarda i blocchi allocati segnalati dal sistema operativo, non la lunghezza logica del contenuto. File sparsi (sparse file, con intervalli non allocati), compressione, hard link e Copy-on-Write, cioè condivisione dei blocchi fino alla modifica, possono produrre valori diversi da quelli di altri strumenti.

Cosa calcola il comando du?

du significa disk usage e percorre l’albero di directory sommando l’occupazione. Include anche lo spazio attribuito alle directory stesse; una riga di directory comprende normalmente i suoi discendenti, quindi non sommare le righe di genitori e figli per ottenere un totale. Il valore non coincide necessariamente con la lunghezza dei file mostrata da ls -l.

Il manuale di GNU du descrive opzioni e unità. La documentazione nel repository di GNU Coreutils, nella sezione du invocation, chiarisce anche hard link, compressione e blocchi condivisi.

Comandi di base più usati

Totale della directory corrente

du -sh .

-s mostra un totale per argomento; -h usa potenze di 1.024, con suffissi come K, M e G (KiB, MiB e GiB), non unità decimali. Specificando . si includono anche file e directory nascosti. Il numero dipende da contenuti, filesystem e arrotondamenti, quindi non aspettarti valori identici fra macchine.

Directory immediatamente sottostanti

du -h --max-depth=1 .

--max-depth=1, abbreviabile in GNU du con -d 1, stampa il punto iniziale e le directory fino a un livello sottostante. I file normali non hanno una riga individuale senza -a, ma contribuiscono ai totali. La profondità limita l’output, non la scansione: per calcolare i totali du continua a leggere i discendenti più profondi. Altre implementazioni Unix possono avere opzioni diverse.

Ordinare gli elementi per dimensione

du -h --max-depth=1 /var | sort -h

sort -h ordina considerando unità leggibili dall'uomo. Per visualizzare in cima gli elementi di grandi dimensioni, utilizzare sort -hr.

du -h --max-depth=1 /var | sort -hr

Le directory senza autorizzazione possono produrre errori e il totale potrebbe essere incompleto. Eseguire con i permessi appropriati solo per l'ambito richiesto, e non nascondere semplicemente gli errori interpretando i risultati come valori completi.

Riepilogo delle principali opzioni

Opzione Funzione Esempi di utilizzo
-h Visualizza in unità leggibili dall'uomo du -h /var/log
-s Mostra solo il totale di ciascun argomento du -sh /var/log
-a Visualizza non solo le directory ma anche i file du -ah ./data
-c Aggiungi un totale generale alla fine du -ch file1 file2
-d N Specifica la profondità massima delle directory da visualizzare du -h -d 2 .
-x Non attraversare altri filesystem du -xhd1 /
--exclude Escludi percorsi che corrispondono a un modello du -sh --exclude='*.log' .
--apparent-size Mostra la dimensione apparente invece dello spazio allocato du -sh --apparent-size file

Esaminare file e directory in dettaglio

Includere anche i file

demo_dir=$(mktemp -d) && (
  cd "$demo_dir" || exit
  mkdir -p data/sub data/cache || exit
  printf 'esempio\n' > data/notes.txt
  printf 'nascosto\n' > data/.hidden
  printf 'cache\n' > data/cache/item
  dd if=/dev/zero of=data/sub/payload.bin bs=1024 count=64 status=none
  du -ah ./data | sort -hr | head -n 20
)

Questo esempio completo crea una directory temporanea separata, alcuni file di prova e mostra fino a 20 righe ordinate per occupazione decrescente. Richiede Bash e GNU Coreutils; il sottoprocesso fra parentesi mantiene la directory corrente della shell originale. Nell’output compaiono anche ./data, ./data/sub, ./data/cache e i file, compreso ./data/.hidden; i totali dei genitori includono già i figli e non sono quantità indipendenti. La directory temporanea resta disponibile per ispezionare i dati creati; il suo percorso è nella variabile demo_dir della shell originale.

Filtrare per dimensione minima

du -h --threshold=1G ./data

Con una soglia positiva GNU du stampa le voci di dimensione maggiore o uguale alla soglia: 1G significa 1 GiB. Senza -a questo esempio filtra le directory, non produce un elenco di tutti i singoli file grandi. La soglia filtra l’output e non evita la scansione; combinandola con --apparent-size si confronta invece la dimensione apparente. Verifica le opzioni della versione installata con du --help.

Escludere file o directory specifici

du -sh --exclude='*.log' --exclude='cache' .

Racchiudi i pattern fra apici singoli per impedire l’espansione anticipata da parte della shell. Per l’esempio seguente prepara nel tuo percorso di lavoro un file di testo du-exclude.txt con *.log sulla prima riga e cache sulla seconda; non inserire gli apici nel file. --exclude-from legge un pattern per riga. L’esclusione riguarda il conteggio di du e non elimina file o directory.

du -sh --exclude-from=du-exclude.txt .

Spazio allocato e dimensione apparente

Spazio allocato sul filesystem

Il du predefinito somma i blocchi allocati riportati dal filesystem. Un file minuscolo può occupare un blocco intero, essere memorizzato in modo speciale o non avere blocchi di dati allocati: non esiste un incremento minimo universale valido per ogni filesystem. Metadati, ridondanza e altre strutture interne possono non essere interamente rappresentati.

Dimensione apparente

--apparent-size misura per un file regolare la lunghezza logica in byte, poi la formatta con le unità richieste. Questo esempio crea un nuovo file sparso da 64 MiB in una directory temporanea, senza usare un’immagine esistente. ls -lh e il secondo du devono indicare circa 64M; il primo du può mostrare molto meno se il filesystem supporta i buchi. Se i valori sono simili, verifica le caratteristiche del filesystem: non è un test universale del suo consumo fisico.

sparse_dir=$(mktemp -d) && (
  cd "$sparse_dir" || exit
  truncate -s 64M sample.img || exit
  ls -lh sample.img
  du -h sample.img
  du -h --apparent-size sample.img
)

I file sparsi possono avere una dimensione logica molto grande ma utilizzare quasi nessun blocco reale. Al contrario, in ambienti con compressione del filesystem, deduplicazione, snapshot o blocchi condivisi Copy-on-Write, il du di base può differire anche dal consumo effettivo sul dispositivo fisico.

Collegamenti fisici

Gli hard link, o collegamenti fisici, sono nomi diversi dello stesso file, identificato dall’inode all’interno del filesystem. GNU du lo conta una sola volta per esecuzione; l’ordine degli argomenti può cambiare a quale percorso viene attribuito. -l o --count-links conta ogni collegamento e può gonfiare il totale rispetto ai blocchi unici. I blocchi Copy-on-Write condivisi da inode distinti costituiscono un caso diverso.

Limitare la scansione al filesystem

Escludere altri filesystem

Quando si esamina il file system root, utilizzare -x o --one-file-system impedisce di scendere in altri file system.

du -xhd1 /

-x evita di scendere nelle directory su un filesystem diverso da quello dell’argomento iniziale; non è un divieto generale di attraversare qualunque punto di mount. Per esempio un bind mount dello stesso filesystem può non essere escluso. I volumi separati saltati non contribuiscono al totale: misura ciascun filesystem pertinente e conserva gli eventuali errori di accesso.

Gestione dei collegamenti simbolici

Per impostazione predefinita (-P) du considera il collegamento simbolico stesso. -H, equivalente a -D in GNU du, segue quelli specificati come argomenti; -L segue anche quelli incontrati durante la scansione. Queste opzioni possono ampliare molto il percorso esaminato: verifica la struttura prima di usarle e considera l’interazione con -x.

Perché du e df mostrano valori diversi

Oggetti di misura diversi

du somma i file raggiungibili nell’albero, mentre df, nella guida in inglese usa le statistiche dell’intero filesystem. Secondo il manuale di GNU df, un percorso passato a df seleziona il filesystem che lo contiene. Percorsi non leggibili, metadati, snapshot e dati nascosti sotto altri mount possono spiegare differenze. I blocchi riservati influenzano soprattutto la disponibilità per utenti non privilegiati: non sono automaticamente tutti spazio used, e Size meno Used può differire da Avail.

File eliminati ma aperti

Se viene rimosso l’ultimo hard link ma un processo mantiene il file aperto, du non trova più un percorso verso quei dati. I blocchi possono restare occupati e visibili a df finché restano riferimenti aperti. lsof +L1 seleziona file aperti con conteggio dei link inferiore a uno, come precisa il manuale ufficiale di lsof. Occorre che lsof sia installato; la visibilità degli altri processi dipende da permessi e namespace. Un elenco vuoto con visibilità limitata non dimostra l’assenza del problema.

lsof +L1

Non terminare forzatamente il processo di destinazione. Invece, controlla il riavvio normale del servizio e le procedure di riapertura dei log. Manipolare arbitrariamente il descrittore di file di un file eliminato può causare perdita di dati o interruzione del servizio.

Uso sicuro e risultati attendibili

  • Per prima cosa, verifica l'intero filesystem con df -h, poi esegui du all'interno del rispettivo punto di mount.
  • Quando si indaga dalla root, decidi se escludere altri filesystem usando -x.
  • Su alberi grandi restringi il percorso e scegli periodi di bassa attività. Limitare la profondità riduce l’output, ma non evita la lettura dei discendenti necessari ai totali.
  • Se ci sono errori di autorizzazione, registra il fatto che i risultati sono incompleti e utilizza solo i permessi minimi necessari.
  • Prima di eliminare un file, verifica il processo proprietario, il backup, la politica di conservazione e se il recupero è possibile.
  • I nomi dei file possono contenere caratteri speciali come interruzioni di riga, quindi considera l'utilizzo di una combinazione di strumenti che supportano la separazione NUL nell'automazione.

Domande frequenti

I file nascosti sono inclusi nei risultati di du?

Se specifichi direttamente la directory, come du -sh ., i file nascosti sono inclusi nel totale. Tuttavia, lo * della shell per impostazione predefinita non corrisponde agli elementi nascosti, quindi i risultati di du -sh * potrebbero escluderli.

Come posso trovare rapidamente le directory più grandi?

Usa du -h --max-depth=1 target | sort -hr, sostituendo target con il percorso, poi approfondisci una directory alla volta. Si riducono righe stampate e lavoro dell’ordinamento; du deve comunque percorrere tutto l’albero selezionato. Per ridurre davvero la scansione restringi il percorso o escludi consapevolmente directory e filesystem.

Perché le dimensioni sono diverse tra du -sh e ls -lh?

ls -lh mostra principalmente la lunghezza logica dei file, mentre du per impostazione predefinita mostra i blocchi di filesystem allocati. Le differenze possono verificarsi a causa di file sparsi, file piccoli e dimensioni dei blocchi.

Posso nascondere gli errori Permission denied?

Sebbene possa rendere lo schermo più pulito, anche il fatto che i risultati siano incompleti scompare. Nelle indagini sulla capacità, è più sicuro controllare prima il percorso in cui si è verificato l'errore e rivedere il motivo e l'ambito delle autorizzazioni richieste.

Riepilogo

du -sh path mostra il totale, e du -h --max-depth=1 path mostra il totale e l’uso delle directory immediatamente sottostanti; per stampare anche i singoli file aggiungi -a. Quando si cercano elementi di grandi dimensioni, combinare con sort -hr e utilizzare -x per escludere altri filesystem.

Il valore di du dipende dal filesystem e dai dati restituiti dal sistema operativo; durante una scansione i file possono anche cambiare, quindi il risultato non è una fotografia atomica. Per spiegare una differenza con df verifica file eliminati ma aperti, percorsi non accessibili, snapshot, metadati e disponibilità riservata.