Comando ls in Linux: file, permessi, dimensioni e ordinamento

ls elenca file e directory; con ls -lah potete vedere anche elementi nascosti, permessi, proprietari, dimensioni e data di modifica. Questa guida descrive GNU ls, incluso nei GNU Coreutils delle comuni distribuzioni Linux.

Per una consultazione nel terminale, ls -lah è una combinazione pratica. Negli script, invece, usate strumenti come find con delimitatori NUL, cioè byte nulli, quando dovete gestire nomi contenenti spazi o fine riga senza separarli per errore.

Cos'è il comando ls?

Il nome ls richiama list, cioè elencare. Il comando mostra informazioni sui file indicati o il contenuto delle directory; controllate type -a ls e ls --version per distinguere il programma GNU da eventuali alias o altre implementazioni.

Senza argomenti, ls elenca il contenuto della directory corrente, omettendo normalmente i nomi che iniziano con un punto. Se indicate una directory, mostra i suoi elementi; con -d mostra invece la directory stessa.

Sintassi di base

ls [options]... [files or directories]...

Per provare le opzioni senza toccare file esistenti, aprite una directory di esercizio nuova e vuota. Il blocco seguente crea alcuni file di testo e una sottodirectory; richiede una shell compatibile con Bash, mkdir e printf. Gli esempi che indicano /etc o /var/log sono invece esempi per un sistema Linux: verificate che quei percorsi esistano e siano leggibili.

mkdir sottodir
printf 'a\n' > alpha
printf 'zzzz\n' > zeta
printf '2\n' > file2
printf '10\n' > file10
printf 'nascosto\n' > .nascosto
printf 'nota\n' > 'nome con spazi'
printf 'opzione=valore\n' > sottodir/esempio.conf
ls

Il primo elenco contiene alpha, file10, file2, nome con spazi, sottodir e zeta; .nascosto resta escluso. Le date e i permessi dipendono dal sistema. Potete anche indicare un file o una directory esistenti, come negli esempi Linux seguenti:

ls /var/log
ls /etc/hosts
ls /etc /usr/local

Non presumete che più argomenti siano visualizzati nell’ordine scritto: GNU ls applica normalmente l’ordinamento anche agli argomenti e distingue file da directory di cui elencare il contenuto. Per esempio, LC_ALL=C ls -d zeta alpha stampa alpha prima di zeta se entrambi esistono. Il contenuto delle directory è ordinato per nome secondo le regole locali, salvo opzioni che scelgono un altro criterio.

Mostrare i file nascosti

Includere tutti gli elementi con -a

-a, o --all, include gli elementi il cui nome inizia con un punto. Mostra anche ., la directory corrente, e .., la directory padre, che non coincide necessariamente con la radice del filesystem.

ls -a

Escludere . e .. con -A

L’opzione -A, o --almost-all, include gli elementi nascosti ed esclude soltanto le voci speciali le voci «.» e «..». Nella directory di esercizio compare quindi .nascosto, mentre le due voci speciali non vengono aggiunte.

ls -A

Leggere il formato lungo di ls -l

-l mostra in formato lungo il tipo di file e i permessi, il numero di collegamenti fisici, il proprietario, il gruppo, la dimensione, l'ora di modifica e il nome.

ls -l

Nell’output lungo, i campi principali compaiono in questo ordine. Per dispositivi speciali, il campo della dimensione può essere sostituito dai numeri del dispositivo.

Voce Significato
Tipo e Permessi Tipo del file e permessi di lettura, scrittura ed esecuzione per proprietario, gruppo e altri utenti.
Numero di Collegamenti Fisici Numero di collegamenti fisici (hard link) all’inode; per le directory l’interpretazione dipende anche dal filesystem.
Proprietario Nome dell’account proprietario, oppure identificatore numerico dell’utente.
Gruppo Nome del gruppo, oppure identificatore numerico.
Dimensione Dimensione logica in byte per i file ordinari, salvo opzioni o impostazioni che cambiano le unità.
Tempo Normalmente mtime, il momento dell’ultima modifica dei dati.
Nome Nome del file; per un collegamento simbolico può comparire anche la destinazione.

Come leggere le stringhe dei permessi

Il primo carattere di una stringa che sembra -rw-r--r-- indica il tipo di file, e i successivi nove caratteri rappresentano i permessi per il proprietario, il gruppo e gli altri, in gruppi di tre caratteri. r significa lettura, w significa scrittura e x significa permesso di esecuzione.

Posizione Esempio Descrizione
Primo carattere -, d, l Tipo: file ordinario, directory o collegamento simbolico.
Dal 2º al 4º rw- Permessi del proprietario.
Dal 5° al 7° r-- Permessi del gruppo.
Dall'8° al 10° r-- Permessi degli altri utenti.

Un segno dopo i permessi può indicare informazioni di sicurezza aggiuntive. ACL significa Access Control List, cioè elenco di controllo degli accessi: per vedere i dettagli può servire getfacl. Le lettere s, S, t e T nei campi dei permessi indicano bit speciali e non sono errori di formattazione. Chmod modifica i permessi; chown cambia il proprietario.

Mostrare gli identificatori numerici con -n

L’opzione -n mostra gli identificatori numerici di utente e gruppo anziché i nomi. È utile per confrontare gli account tra sistemi o evitare la risoluzione dei nomi.

ls -ln

Leggere dimensioni e spazio allocato

Scegliere unità leggibili con -h

-h usa potenze di 1024 e suffissi compatti come K, M e G: per esempio 1K corrisponde a 1024 byte. Non aspettatevi le lettere KiB nell’output. Usatelo con -l o -s; per potenze di 1000 GNU ls offre --si.

ls -lh
ls -lah

ls -lah è spesso usato nel lavoro interattivo perché mostra elementi nascosti in formato lungo.

Leggere lo spazio allocato con -s

-s mostra lo spazio allocato per ogni file, espresso nelle unità di blocco scelte da ls. Non è un conteggio universale dei settori fisici: le unità possono dipendere dalle opzioni e dalle variabili d’ambiente; con -h vengono rese leggibili. La dimensione logica e lo spazio allocato possono differire per file sparsi, compressione e caratteristiche del filesystem.

ls -sh
ls -lsh

Per sommare lo spazio totale occupato da un'intera directory, du è più adatto di ls.

Cambiare l’ordinamento

L’ordinamento predefinito segue i nomi e le regole locali. Potete scegliere un altro criterio, per esempio tempo, dimensione o versione, oppure invertire l’ordine con -r.

Ordinare per modifica con -t

ls -lt
ls -lat

Per impostazione predefinita, -t visualizza gli elementi a partire dai più recentemente modificati. Questo è utile per trovare log o file di risultati creati di recente.

Ordinare per dimensione con -S

ls -lhS

-S ordina per dimensione del file in ordine decrescente. La dimensione mostrata negli elenchi delle directory non è la somma dei contenuti, quindi usa du per confrontare l'utilizzo del disco.

Ordinamento inverso e per versione con -r, -v

ls -ltr
ls -1v

-r inverte l'ordine di ordinamento corrente. Pertanto, ls -ltr mostra le voci dalla più vecchia alla più nuova. -v esegue un ordinamento per versione che considera le parti numeriche, quindi file2 viene prima di file10.

Distinguere le directory ed elencare la directory stessa

Aggiunta di indicatori di tipo con -F

-F o --classify aggiungono indicatori di tipo come / alle directory, * ai file eseguibili e @ ai collegamenti simbolici.

ls -F

Gli indicatori aggiunti da -F non fanno parte dei nomi. Negli script, usate i test sui file o find per riconoscere il tipo: rimuovere l’ultimo carattere da una stringa visualizzata da ls può alterare un nome reale.

Visualizzare la directory stessa invece del suo contenuto con -d

Per leggere i permessi e le date della directory stessa, unite -d al formato lungo -l. Senza -d, un argomento che indica una directory fa normalmente elencare il suo contenuto.

ls -ld /var/log
ls -d */

ls -d */ usa un’espansione della shell: in Bash con le impostazioni abituali esclude le directory nascoste, ma può includere collegamenti simbolici che portano a directory. Opzioni come dotglob cambiano quali nomi vengono espansi. Se non ci sono corrispondenze, Bash normalmente passa il testo */ a ls, che segnala un errore; non considerate questa forma una ricerca universale.

Raggruppare prima le directory

ls --group-directories-first

L’estensione GNU --group-directories-first raggruppa le directory prima degli altri elementi nel medesimo elenco. Non rende -l ricorsivo e non sostituisce -d quando volete mostrare gli argomenti directory stessi. Verificatene il supporto su altri sistemi.

Visualizzazione ricorsiva delle sottodirectory

ls -R /etc

L’opzione -R, o --recursive, elenca anche il contenuto delle sottodirectory. Su alberi grandi l’output può essere molto lungo e contenere errori di accesso. Per la prova locale potete usare ls -R sottodir invece di esplorare tutto /etc.

Per selezionare file in base a un nome o a una condizione, find esprime direttamente il criterio. Nell’esempio seguente cerca file ordinari il cui nome termina con .conf; le virgolette impediscono alla shell di espandere il modello prima di avviare find.

find /etc -type f -name '*.conf'

Scelta dei tipi di tempo e dei formati di visualizzazione

Tempo di accesso e tempo di modifica dello stato

La data predefinita di ls -l è mtime, l’ultima modifica dei dati. ls -lu mostra atime, il tempo di accesso, ma ordina ancora per nome; ls -lc mostra ctime, il tempo di cambiamento dello stato. Con -ltu o -ltc, anche l’ordinamento usa rispettivamente atime o ctime, dal più recente.

ls -lu
ls -lc
ls -ltu
ls -ltc

Ctime non è la data di creazione: indica l’ultimo cambiamento dello stato dell’inode, la struttura con cui il filesystem rappresenta il file, per esempio dopo una modifica dei permessi. Le politiche del filesystem possono limitare gli aggiornamenti di atime; non usatelo come prova che un file non sia mai stato letto.

Usare un formato di data coerente

GNU ls permette di scegliere la forma delle date nel formato lungo con --time-style. Long-iso usa una data numerica e ore e minuti; full-iso aggiunge precisione e indicazione del fuso orario.

ls -l --time-style=long-iso
ls -l --time-style=full-iso
ls -l --time-style='+%Y-%m-%d %H:%M:%S'

L'output può essere influenzato dalla localizzazione e dalla variabile d'ambiente TZ. Per report destinati al confronto umano, è consigliato impostare insieme il fuso orario e il formato di visualizzazione.

Colori e visualizzazione dei nomi

Usare i colori

ls --color=auto

Con --color=auto, ls emette sequenze di colore quando lo standard output è collegato a un terminale. Un alias può aggiungere questa opzione: i due controlli seguenti mostrano la risoluzione del nome e l’eventuale alias. Se non è definito alcun alias, alias ls può terminare con stato diverso da zero.

type ls
alias ls

I colori sono influenzati dalla variabile di ambiente LS_COLORS e dalle impostazioni dircolors. Quando si salva in un file o si passa ad altri comandi, è possibile utilizzare --color=never per evitare di includere caratteri di controllo non necessari.

Nomi di file con spazi e caratteri speciali

Il nome mostrato può contenere virgolette o escape aggiunti da ls, secondo le opzioni e il tipo di uscita. Non considerate questa rappresentazione una copia dei byte originali del nome.

ls -Q
ls --quoting-style=shell-escape

L’opzione -Q racchiude i nomi tra virgolette doppie. L’estensione GNU --quoting-style sceglie la rappresentazione: nella prova, il nome con spazi resta leggibile, ma il formato non sostituisce i delimitatori adatti all’elaborazione automatica.

Combinazioni utilizzate frequentemente

Comando Scopo
ls -la Formato lungo, inclusi i nomi nascosti.
ls -lah Formato lungo, nomi nascosti e dimensioni con suffissi leggibili.
ls -lhS Formato lungo ordinato dalla dimensione maggiore.
ls -ltr Formato lungo dal mtime meno recente.
ls -ld */ Informazioni sulle directory espanse dalla shell, anziché sul loro contenuto.
ls -1 Un elemento per riga; un nome con fine riga può comunque occupare più righe.
ls -1v Ordine naturale delle parti numeriche, un elemento per riga.
ls -l --time-style=long-iso Date numeriche con ore e minuti nel formato lungo.

Riepilogo delle opzioni principali

Opzione Descrizione
-a, --all Include gli elementi nascosti e le voci «.» e «..».
-A, --almost-all Include i nomi nascosti, escludendo «.» e «..».
-l Mostra tipo, permessi, proprietario, gruppo, dimensione e data.
-h, --human-readable Con -l o -s usa suffissi leggibili e potenze di 1024.
-d, --directory Mostra le directory stesse, senza elencarne il contenuto.
-R, --recursive Elenca ricorsivamente le sottodirectory.
-t Ordina normalmente dal mtime più recente.
-S Ordina dalla dimensione maggiore.
-r, --reverse Inverte il criterio di ordinamento scelto.
-v Considera le parti numeriche per l’ordine di versione.
-F, --classify Aggiunge indicatori del tipo, per esempio /, * e @.
-1 Mostra un elemento per riga, salvo fine riga presenti nel nome.

Motivi per non analizzare l'output di ls negli script

I nomi dei file Linux possono contenere spazi, tabulazioni e nuove righe. ls cambia colonne, colori e citazioni per renderlo leggibile dall'uomo nel terminale, quindi gli script che dividono per righe o spazi potrebbero gestire i file in modo errato.

Il ciclo seguente richiede Bash, perché usa read -d '' per leggere fino a NUL. Mantiene ogni nome in una sola variabile, anche se contiene spazi o fine riga; la stampa con printf serve però soltanto alla consultazione e torna a separare l’output con fine riga. Per inoltrare i nomi a un altro programma conservate i delimitatori NUL o usate find -exec.

find . -maxdepth 1 -type f -print0 | while IFS= read -r -d '' file; do
  printf '%s\n' "$file"
done

Le versioni GNU recenti documentano anche ls --zero; controllate ls --help sul sistema di destinazione, perché versioni precedenti possono non supportarlo. Per selezionare file con condizioni e avviare elaborazioni, find -print0 o find -exec esprimono meglio l’intento. Per i metadati di un singolo file potete usare stat.

Problemi comuni

Viene visualizzato Permesso negato.

Per leggere i nomi serve il permesso di lettura della directory; per attraversare il percorso e leggere i metadati dei suoi elementi serve normalmente anche il permesso di ricerca, indicato da x sulle directory. Controllate i componenti con ls -ld percorso o namei -l percorso, considerando anche ACL e altre politiche. Concordate l’accesso necessario con l’amministratore invece di aggiungere sudo senza diagnosi.

L'ordine di ordinamento è diverso dal previsto.

La categoria locale LC_COLLATE influisce sull’ordine dei nomi; LC_ALL, se impostata, ha precedenza. Per una prova riproducibile potete applicare LC_ALL=C soltanto al comando, senza modificare la sessione.

LC_ALL=C ls

Si verifica un errore "Elenco degli argomenti troppo lungo".

In ls *, la shell espande l’asterisco prima di avviare ls. Troppi nomi possono superare il limite degli argomenti del sistema: l’errore avviene prima che ls inizi. Per elencare una directory basta ls; per selezione ed elaborazione usate find con -exec o una pipeline che mantenga i delimitatori NUL.

Domande frequenti

In ls -l, la dimensione della directory è la somma dei file interni?

No. La dimensione della directory mostrata da ls -l è quella riportata dal filesystem per i dati della directory stessa, non la somma dei file contenuti e neppure la dimensione della sola struttura inode. Per stimare lo spazio su disco dell’intero albero usate du -sh directory, considerando permessi, collegamenti e opzioni di du.

Qual è la differenza tra ls -a e ls -A?

-a mostra tutti gli elementi nascosti inclusi . e ... -A mostra gli elementi nascosti ma esclude queste due voci speciali della directory.

Come posso vedere prima i file modificati più di recente?

Usate ls -lt per il formato lungo dal più recente al più vecchio secondo mtime. L’opzione -r inverte il criterio: ls -ltr parte quindi dai meno recenti.

Terminata la prova, controllate i nomi creati nella directory di esercizio e rimuovete soltanto quei file e la sottodirectory sottodir. Non applicate comandi di pulizia agli esempi che indicano percorsi di sistema.

Documentazione di riferimento