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.




