Comando stat in Linux: dimensioni, permessi e timestamp

Il comando stat mostra i metadati di un file o di una directory: dimensione, permessi, proprietario, inode, collegamenti e date. Con -c puoi selezionare i campi da usare in uno script, mentre -f interroga il file system che contiene il percorso.

Gli esempi riguardano stat di GNU Coreutils; le versioni BSD e macOS possono avere opzioni differenti. Un inode è la struttura con cui un file system gestisce i metadati di un file. Un timestamp rappresenta una data e un’ora: qui distingueremo accesso, modifica del contenuto, variazione dello stato e creazione.

Cos'è il comando stat?

stat legge le informazioni di stato gestite dal file system, senza analizzare il contenuto come testo o immagine. Per una prova completa, scegli una posizione scrivibile in cui stat-demo non esista. Questa sequenza per Bash e GNU Coreutils crea un file con dimensione logica di 4096 byte e ne mostra i metadati.

mkdir stat-demo &&
cd ./stat-demo &&
truncate -s 4096 report.txt &&
stat -- report.txt

truncate imposta qui la dimensione del nuovo file; non garantisce che siano allocati 4096 byte fisici. Il comando file ha invece uno scopo diverso: riconosce il formato leggendo firme e altre caratteristiche del contenuto. Dopo la prova ti trovi dentro stat-demo; gli altri nomi della guida sono esempi e richiedono file già esistenti.

Sintassi di base

stat [option] file...

È possibile specificare non solo un singolo file, ma anche più percorsi contemporaneamente.

stat file1.txt file2.txt
stat src tests
stat "annual report.pdf"

Per i nomi di file che iniziano con un trattino, specificarli dopo -- in modo che non vengano interpretati come opzioni.

stat -- -sample.txt

È possibile controllare la versione di GNU stat e le opzioni supportate con il seguente comando.

stat --version
stat --help
info '(coreutils) stat invocation'

Leggere l’output predefinito

Il blocco seguente è un esempio illustrativo di output GNU/Linux per un file di 4096 byte. Non riporta i valori effettivi del tuo computer: dispositivo, inode, blocchi, permessi, proprietario e date dipendono dal file system, dalla versione e dall’ambiente. In particolare, il file di prova creato con truncate può avere un’allocazione diversa.

  File: report.txt
  Size: 4096       Blocks: 8          IO Block: 4096   regular file
Device: 8,1        Inode: 1234567     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ user)   Gid: ( 1000/ user)
Access: 2026-09-21 10:15:30.000000000 +0900
Modify: 2026-09-21 10:14:02.000000000 +0900
Change: 2026-09-21 10:14:02.000000000 +0900
 Birth: 2026-09-20 19:42:11.000000000 +0900

Ogni voce ha il seguente significato.

Voce Significato
File Il nome del file o della directory interrogata.
Size La dimensione logica del file, solitamente visualizzata in byte.
Blocks Numero di blocchi allocati. La loro unità in byte è %B; non coincide necessariamente con IO Block.
IO Block Informazioni sulla dimensione del blocco consigliata per un input/output efficiente.
Device Il numero che identifica il dispositivo a cui appartiene il file.
Inode Numero di inode, significativo nel file system che contiene il file.
Links Il numero di link fisici che puntano allo stesso inode.
Access Mostra i permessi e il tipo di file in forma ottale e simbolica.
Uid, Gid L'ID numerico e il nome dell'utente proprietario e del gruppo.
Access, Modify, Change, Birth Timestamp riguardanti accesso, modifica del contenuto, cambiamento di stato e creazione.

Differenza tra ls -l e stat

Elementi di confronto ls -l stat
Scopo principale Confrontare rapidamente più file in forma di elenco. Controllare i metadati dettagliati del file specificato.
Data predefinita Mostra normalmente una forma abbreviata di mtime. Distingue accesso, modifica, stato e creazione, quando disponibili.
inode e blocchi È necessario aggiungere opzioni per vedere alcune informazioni. Mostra inode, numero di link, blocchi allocati, ecc., nell'output predefinito.
Output dello script L'analisi di elenchi leggibili dall'uomo può essere instabile a seconda dell'ambiente. È possibile specificare direttamente i campi necessari con --format.
Informazioni sul file system Non fornito direttamente. Usa -f per visualizzare lo stato del file system dove si trova il file.

ls -l è comodo per confrontare rapidamente nomi, dimensioni e permessi di molti file. stat permette di approfondire un percorso o di estrarre campi specifici per l’automazione; nessuno dei due output va interpretato come un elenco universale di ogni metadato possibile.

Dimensione logica e blocchi allocati

Verifica della dimensione logica

Size, e il formato %s, indicano la dimensione logica in byte di un file regolare. Per il report.txt appena creato, stat -c '%s' report.txt restituisce 4096. Negli esempi seguenti sostituisci i nomi con i percorsi da esaminare.

stat -c '%s' disk.img
stat -c '%n: %s bytes' file1 file2

Per una directory, Size riguarda la directory stessa e i dati con cui rappresenta le proprie voci; non è la somma dei file contenuti e non è la dimensione dell’inode. Per l’uso complessivo dello spazio sotto una directory usa uno strumento come du -sh directory.

Calcolo dello spazio allocato

%b indica il numero di blocchi allocati e %B la loro unità in byte. Su Linux l’unità di st_blocks è di 512 byte; per interpretare l’output GNU usa comunque il valore di %B. IO Block, corrispondente a %o, è invece un suggerimento per trasferimenti efficienti e non l’unità con cui moltiplicare %b.

stat -c 'size=%s blocks=%b block-size=%B' disk.img

Il prodotto %b × %B esprime l’allocazione riportata dal file system. Nei file sparsi alcune regioni logiche non occupano blocchi; compressione, condivisione e altri dettagli possono rendere questo dato diverso dallo spazio fisico esclusivo sul dispositivo. Non dedurre il consumo reale dalla sola Size.

Permessi e proprietà

Visualizzazione dei permessi in ottale e dei permessi simbolici

%a stampa i bit di permesso in ottale; %A li rappresenta con simboli e include il tipo di file. L’esempio richiede uno script.sh già esistente: il comando legge i permessi, senza modificarli.

stat -c '%a %A %n' script.sh

Se il file ha permessi 755, un risultato possibile è il seguente. I permessi effettivi del tuo file possono essere diversi.

755 -rwxr-xr-x script.sh

Visualizzazione del proprietario e del gruppo

%U e %G mostrano il nome del proprietario e del gruppo; %u e %g i rispettivi identificatori numerici, User ID (UID) e Group ID (GID).

stat -c 'owner=%U(%u) group=%G(%g)' report.txt

Nei casi in cui il nome corrispondente a un ID numerico non può essere trovato, il campo nome può essere visualizzato in modo diverso.

Inode e collegamenti fisici

Visualizzazione del numero dell'inode

%i visualizza il numero di inode che identifica il file all'interno del file system.

stat -c '%i %n' report.txt

Un numero di inode è significativo soltanto nel file system a cui appartiene e può essere riutilizzato dopo la rimozione di un file. Per confrontare due percorsi nello stesso momento, considera insieme dispositivo %d e inode %i.

Controllare il numero di collegamenti fisici

%h mostra il numero di collegamenti fisici, o hard link, allo stesso inode. Per una prova nella cartella stat-demo, la sequenza seguente crea un secondo nome per report.txt. copy-link.txt non deve esistere e il file system deve supportare i collegamenti fisici.

ln -- report.txt copy-link.txt &&
stat -c 'device=%d inode=%i links=%h name=%n' report.txt copy-link.txt

Per questi due nomi ci si aspetta lo stesso dispositivo e lo stesso inode, con almeno due collegamenti. Non si tratta di una copia del contenuto: scrivere tramite uno dei nomi modifica lo stesso file. Per annullare la prova elimina soltanto il nuovo collegamento con rm -- copy-link.txt; report.txt rimane disponibile. Un collegamento simbolico è invece un oggetto separato e, senza -L, mostra i propri metadati.

Differenze tra atime, mtime, ctime e Birth

atime significa access time, mtime modification time e ctime change time. Quest’ultimo riguarda lo stato dell’inode e può cambiare anche quando scrivi il contenuto: non è una data di creazione. Birth indica invece la creazione, se il sistema è in grado di fornirla.

Tempo Significato Esempi che possono essere modificati
atime Ultimo accesso ai dati del file. Può cambiare leggendo dati; opzioni di montaggio e cache possono limitarne gli aggiornamenti.
mtime L'ultima volta che il contenuto del file è stato modificato. Scrittura dei dati del file o modifica della lunghezza del contenuto.
ctime Ultima variazione dello stato dell’inode. Scrittura del contenuto, cambiamenti di permessi, proprietà o numero di collegamenti. Non è la creazione.
Birth L'orario in cui il file è stato creato. Registrato una volta alla creazione se supportato e non cambia con i normali cambiamenti di stato.

Date in formato leggibile

%x, %y, %z e %w stampano rispettivamente atime, mtime, ctime e Birth in un formato leggibile dall'uomo.

stat -c 'atime=%x
mtime=%y
ctime=%z
birth=%w' report.txt

Quando la data di creazione non è disponibile, %w mostra -. La disponibilità dipende dal file system, dalle interfacce del sistema operativo e dalla versione di stat; non implica da sola che il file sia danneggiato.

Secondi dalla Unix Epoch

%X, %Y, %Z e %W restituiscono i tempi in secondi dalla Unix Epoch, il riferimento del 1° gennaio 1970 alle 00:00:00 UTC. Le forme minuscole sono più adatte alla lettura umana e possono mostrare frazioni di secondo.

stat -c 'atime=%X mtime=%Y ctime=%Z birth=%W' report.txt

Se la creazione è sconosciuta, %W restituisce 0. Un confronto dei soli secondi interi non distingue due modifiche avvenute nello stesso secondo; anche il file system può avere una risoluzione inferiore. Il fuso orario cambia la rappresentazione leggibile, non il valore Epoch dello stesso istante.

Controllo delle informazioni sui collegamenti simbolici

Visualizzazione dei metadati del collegamento stesso

Per impostazione predefinita, GNU stat non segue i collegamenti simbolici ed esamina il collegamento stesso.

stat current.log
stat -c '%N | inode=%i | type=%F' current.log

%N può visualizzare il nome del file tra virgolette insieme alla sua destinazione per i collegamenti.

Visualizzare i metadati della destinazione con -L

L'utilizzo di -L o --dereference controlla lo stato del target effettivo a cui il collegamento punta.

stat -L current.log
stat -L -c '%n | inode=%i | type=%F | size=%s' current.log

I collegamenti simbolici interrotti non possono controllare il target, quindi l'uso di -L provocherà un errore.

Selezionare i campi di output

Utilizzo di -c e --format

-c o --format restituiscono i risultati nel formato specificato e aggiungono un'interruzione di riga per ogni file.

stat -c '%n %s %a %U:%G' file1 file2
stat --format='name=%n type=%F inode=%i' report.txt

È sicuro racchiudere la stringa del formato tra virgolette singole in modo che la shell non la interpreti.

Componi più righe con --printf

--printf interpreta le sequenze di escape con backslash ma non aggiunge interruzioni di riga automatiche. Inserisci \n direttamente dove necessario.

stat --printf='name=%n\nsize=%s\nmode=%a\n' report.txt

Con più file aggiungi nel formato anche i separatori necessari. Per elaborazioni automatiche --printf permette, per esempio, una terminazione NUL con \0; scegli un formato che il programma destinatario sappia interpretare. Separare semplicemente i nomi con spazi o nuove righe non è affidabile per tutti i nomi ammessi.

Specificatori di formato usati frequentemente

Specificatore Contenuto dell'output
%n Il nome del file.
%N Nome tra virgolette; per un collegamento simbolico può includere la destinazione.
%F Il tipo di file, come un file normale, una directory o un collegamento simbolico.
%s Questa è la dimensione totale (in byte).
%b Questo è il numero di blocchi allocati.
%B Questa è la dimensione in byte di un blocco rappresentata da %b.
%a Permessi ottali.
%A Permessi simbolici compreso il tipo di file.
%u, %g UID e GID numerici del proprietario.
%U, %G Nome utente del proprietario e nome del gruppo.
%i Il numero dell'inode.
%h Numero di collegamenti fisici.
%m Il punto di mount a cui appartiene il file.
%x, %X Visualizza l'ultima data di accesso in un formato leggibile dall'uomo o come secondi dall'Epoca.
%y, %Y Visualizza l'ultimo momento di modifica del contenuto in un formato leggibile dall'uomo o come secondi Epoch.
%z, %Z Visualizza l'ultimo momento di cambio di stato in un formato leggibile dall'uomo o come secondi Epoch.
%w, %W Visualizza il momento di creazione in un formato leggibile dall'uomo o come secondi Epoch; se sconosciuto, mostra un trattino o 0.
%C Visualizza il contesto di sicurezza SELinux negli ambienti supportati.

Informazioni sul file system

Visualizza lo stato del file system con -f

Usando -f o --file-system vengono visualizzate informazioni sul file system in cui si trova il percorso, piuttosto che sul file stesso.

stat -f /
stat --file-system /home

Puoi controllare il tipo di file system, il numero totale di blocchi, i blocchi disponibili, il numero di inode e la lunghezza massima del nome del file.

Specificatori del file system

Con -f gli stessi simboli possono avere significati diversi: %T è il tipo di file system, %b il totale dei blocchi dati e %a i blocchi disponibili agli utenti non privilegiati. Per questi conteggi l’unità è %S, non il %B usato nella modalità per i singoli file.

stat -f -c 'type=%T total=%b available=%a block-size=%S' /

Per confrontare l'utilizzo del disco in modo leggibile dall'uomo, df -h può essere più comodo, e per estrarre solo i campi del file system necessari per l'automazione, stat -f -c è utile.

File system remoti e politiche di cache

Nelle versioni che la supportano, --cached=MODE regola l’uso degli attributi memorizzati nella cache. È soprattutto utile quando il percorso appartiene a un file system remoto.

Modalità Azione
default Lascia la scelta alla politica predefinita del file system.
always Usa attributi memorizzati nella cache se possibile. Può essere veloce, ma potrebbe non essere aggiornato.
never Tenta di sincronizzare gli attributi più recenti; può aumentare la latenza.
stat --cached=never /mnt/remote/report.txt

never chiede di sincronizzare gli attributi quando possibile, ma non è una garanzia universale contro dati obsoleti o modifiche concorrenti. Il comportamento dipende dal file system remoto, per esempio NFS (Network File System), e dalle opzioni di montaggio. Verifica il supporto con stat --help.

Esempi di utilizzo in script shell

Confrontare la dimensione con una soglia

#!/usr/bin/env bash
if [ "$#" -ne 1 ]; then
  printf '%s\n' 'Uso: bash controlla-dimensione.sh percorso' >&2
  exit 2
fi
path=$1
size=$(stat -L -c '%s' -- "$path") || exit 1
if [ "$size" -gt 104857600 ]; then
  printf '%s\n' 'La dimensione supera 100 MiB.'
else
  printf '%s\n' 'La dimensione non supera 100 MiB.'
fi

Salva il blocco precedente in controlla-dimensione.sh e avvialo con bash controlla-dimensione.sh ./report.txt. -L misura il file di destinazione se il percorso è un collegamento simbolico. La soglia è di 100 MiB, cioè 104857600 byte: il confronto -gt richiede una dimensione strettamente maggiore. Non assumere che il valore letto resti invariato fino a un’operazione successiva.

Confrontare le date di modifica

#!/usr/bin/env bash
if [ "$#" -ne 2 ]; then
  printf '%s\n' 'Uso: bash confronta-mtime.sh primo secondo' >&2
  exit 2
fi
left_mtime=$(stat -L -c '%Y' -- "$1") || exit 1
right_mtime=$(stat -L -c '%Y' -- "$2") || exit 1
if [ "$left_mtime" -gt "$right_mtime" ]; then
  printf '%s\n' 'Il primo file è stato modificato più recentemente.'
elif [ "$left_mtime" -lt "$right_mtime" ]; then
  printf '%s\n' 'Il secondo file è stato modificato più recentemente.'
else
  printf '%s\n' 'Le date coincidono al secondo.'
fi

Salva questo secondo esempio in confronta-mtime.sh e avvialo con bash confronta-mtime.sh file-a file-b, indicando due percorsi reali. Entrambe le letture verificano lo stato di uscita di stat. Date uguali al secondo non dimostrano contenuti identici; per backup o distribuzione considera anche checksum, versioni, ripristino dei timestamp e possibili modifiche concorrenti.

Comandi stat utilizzati frequentemente

Comando Scopo
stat file Mostra i principali metadati disponibili del file.
stat -L link Mostra i metadati del file di destinazione del collegamento simbolico.
stat -c '%s' file Mostra la dimensione del file in byte.
stat -c '%a %n' file Visualizza i permessi in ottale e il nome del file.
stat -c '%U:%G' file Visualizza l'utente proprietario e il gruppo.
stat -c '%i %h %n' file Visualizza l'inode, il numero di collegamenti fisici e il nome del file.
stat -c '%y' file Visualizza l'ultima volta che il contenuto è stato modificato.
stat -c '%Y' file Stampa l'ultima modifica come secondi Epoch.
stat -f path Visualizza informazioni sul file system che contiene il percorso indicato.
stat -t file Mostra in formato conciso su una singola riga con campi fissi.

Precauzioni durante l'uso

ctime non indica la creazione

ctime registra l’ultima variazione dello stato dell’inode, inclusi cambiamenti di permessi o proprietà e scritture del contenuto. Il nome deriva da change time, non da creation time. Quando disponibile, la creazione è indicata da Birth.

Limiti di Birth e atime

Il tempo di creazione potrebbe non essere supportato a seconda del file system, del kernel e del metodo di mount. Anche atime potrebbe non essere aggiornato immediatamente ogni volta che un file viene letto a causa delle politiche di mount come noatime o relatime e della cache.

Usare formati espliciti negli script

L'output predefinito è in un formato leggibile dall'uomo e può variare a seconda del sistema operativo, della versione di Coreutils e della localizzazione. Per l'automazione, seleziona solo i campi necessari con -c e considera che i nomi dei file possono contenere spazi o interruzioni di riga.

Domande frequenti

Come posso controllare solo i permessi ottali di un file?

Usa stat -c '%a' filename. Se hai bisogno anche del nome del file, usa stat -c '%a %n' filename.

Qual è la differenza tra mtime e ctime?

mtime è l'orario in cui il contenuto del file è stato modificato l'ultima volta, e ctime è l'orario in cui lo stato dell'inode, come permessi, proprietà e numero di collegamenti, è stato modificato l'ultima volta. ctime non è l'orario di creazione del file.

Perché Birth è indicato con un trattino?

È perché il file system o il sistema operativo in uso non fornisce l'ora di creazione, oppure stat non è riuscito a ottenere quel valore. In questo caso, %w visualizza un trattino, e %W visualizza 0.

La dimensione di una directory è la somma totale di tutti i file al suo interno?

No. La dimensione riguarda i dati della directory stessa, non la somma del contenuto e non la dimensione dell’inode. Per lo spazio complessivo sotto quel percorso usa du -sh directory.

Documentazione di riferimento