Comando mkdir in Linux: creare directory e impostare i permessi

mkdir crea nuove directory in Linux. Con -p crea anche le directory superiori mancanti e accetta quelle già esistenti: è utile per preparare la struttura di un progetto o di una distribuzione applicativa.

Gli esempi si riferiscono a GNU Coreutils. Controlla mkdir --help e man mkdir sul sistema di destinazione; le opzioni lunghe e quelle per i contesti di sicurezza non sono disponibili ovunque.

Cos'è il comando mkdir?

mkdir crea le directory indicate, nell’ordine degli argomenti. Senza -p segnala un errore se manca una directory superiore o se il nome esiste già. Con -p crea i componenti mancanti e non modifica i permessi delle directory già esistenti.

Sintassi di base

mkdir [OPTION]... DIRECTORY...

Racchiudi tra virgolette i percorsi con spazi. Con GNU Coreutils, mkdir -- -archivio crea una directory il cui nome inizia con un trattino. La sintassi precedente è uno schema: sostituisci i segnaposto, senza copiarne le parentesi.

Uso base di mkdir

Crea una directory

Usa un percorso relativo alla directory corrente oppure un percorso assoluto. La directory superiore deve già esistere. Per provare gli esempi, crea prima una cartella di lavoro nuova con mkdir mkdir-demo && cd mkdir-demo; se il nome esiste già, scegline un altro. Gli esempi sotto /srv riguardano un percorso di sistema e richiedono i permessi appropriati: non eseguirli nel laboratorio senza adattarli.

mkdir logs
mkdir /srv/myapp

Crea diverse directory

Ogni percorso è un operando separato. Metti tra virgolette i nomi che contengono spazi.

mkdir src tests docs
mkdir 'project files'

Creare le directory superiori mancanti

-p crea la gerarchia necessaria. Ripetere lo stesso comando non causa un errore se i percorsi sono già directory, ma non corregge permessi, proprietario o un percorso sbagliato. Nel secondo comando, {bin,config,logs} è un’espansione della shell Bash: produce tre argomenti prima che venga eseguito mkdir; non è una funzione di mkdir né della shell POSIX sh.

mkdir -p project/src/components
mkdir -p /srv/myapp/{bin,config,logs}

Verificare il percorso creato

Se tutto va bene, mkdir normalmente non stampa nulla. Questo esempio crea demo-dir/logs e poi elenca le directory create con find. Eseguilo in una cartella di lavoro nuova per ottenere esattamente il risultato mostrato.

mkdir -p demo-dir/logs
find demo-dir -type d

Esempio di output:

demo-dir
demo-dir/logs

Anche se la directory viene creata, non significa che i permessi siano quelli previsti. Verifica i permessi effettivi con stat -c '%a %n' demo-dir demo-dir/logs.

Opzioni principali

Opzione Scopo
-p, --parents Crea le directory superiori mancanti e accetta le directory esistenti, senza cambiarne i permessi.
-m MODE Imposta i permessi delle nuove directory indicate come argomenti; non quelli dei componenti superiori creati da -p.
-v Mostra un messaggio per ogni directory effettivamente creata.
-Z Imposta il tipo SELinux predefinito per ogni nuova directory, nei sistemi che lo supportano.
--context=CONTEXT Imposta il contesto SELinux o SMACK specificato, se supportato; senza valore, --context si comporta come -Z.

Le opzioni lunghe rendono spesso più leggibili gli script. Per la portabilità, confronta le opzioni GNU con mkdir in POSIX.1-2024, che specifica -p e -m. Le opzioni di sicurezza richiedono il supporto del sistema e una politica appropriata: non sostituiscono la verifica dei permessi.

Esempi pratici

Creare una directory con permessi espliciti

-m accetta la notazione numerica o simbolica di chmod. 750 concede lettura, scrittura e attraversamento al proprietario, lettura e attraversamento al gruppo e nessun accesso agli altri; u=rwx,go= concede accesso solo al proprietario. Questi sono permessi ordinari: verifica anche proprietario, gruppo ed eventuali liste di controllo degli accessi (ACL) o bit speciali ereditati dalla directory superiore.

mkdir -m 750 private-data
mkdir -m u=rwx,go= project-secret

Controllare i permessi delle directory superiori

In mkdir -p -m 750 a/b/c, -m riguarda la nuova directory c, non le directory intermedie a e b. umask è la maschera dei permessi da escludere alla creazione. Nel seguente laboratorio, 027 produce i permessi ordinari 750 per le directory nuove in assenza di ACL predefinite; le parentesi limitano il cambiamento di umask alla subshell. Il successivo find applica chmod a tutte le directory sotto app, anche preesistenti: usalo solo sulla gerarchia di prova sotto il tuo controllo, non su un albero condiviso o non fidato.

( umask 027; mkdir -p app/cache/data )
find app -type d -exec chmod 750 {} +

Verifica il risultato

Controlla il codice di uscita: zero indica il successo per tutti gli argomenti; un valore diverso da zero indica almeno un errore. Una parte delle directory può essere già stata creata anche in caso di errore: non si tratta di una transazione con annullamento automatico. Il seguente stat mostra permessi, proprietario e gruppo; per leggere questi campi vedi anche la guida al comando stat.

mkdir -pv deploy/releases/current
stat -c '%A %U:%G %n' deploy deploy/releases deploy/releases/current

mkdir e comandi correlati

Comando o metodo Ruolo principale Quando usarlo
mkdir Creare directory Spazi di lavoro e alberi di directory
install -d Creare directory e impostarne gli attributi Installazione e distribuzione di applicazioni
rmdir Rimuovere directory vuote Rimuovere un percorso soltanto se è vuoto
mktemp -d Creare una directory temporanea con nome non prevedibile Spazi di lavoro temporanei per script

Avvertenze importanti

-p crea anche i percorsi scritti male

Un errore di battitura può diventare una nuova directory, invece di produrre un errore immediato. Controlla prima i valori delle variabili e il percorso finale. Per ripulire il laboratorio, verifica di essere nella cartella mkdir-demo e usa rmdir sui percorsi vuoti, partendo dai più profondi; un errore di directory non vuota va esaminato prima di eliminare altro.

I permessi predefiniti dipendono da umask

Senza -m, i permessi ordinari iniziali derivano da 777 con i bit della umask rimossi: ad esempio 022 lascia 755. Le ACL predefinite possono modificare questo calcolo e i bit speciali possono essere ereditati: verifica il risultato effettivo. Per i componenti superiori creati da -p, GNU assicura inoltre scrittura e attraversamento al proprietario per poter proseguire la creazione. Su directory già esistenti, -p non applica nuovamente né umask né -m.

Creazione e attraversamento richiedono permessi distinti

Per creare una sottodirectory servono scrittura e attraversamento (permesso x) nella directory che la conterrà, oltre all’attraversamento dei componenti precedenti. Controlla l’intero percorso, ad esempio con namei -l PERCORSO se disponibile. Un filesystem in sola lettura o una politica di sicurezza può impedire la creazione anche quando i bit ordinari sembrano corretti.

FAQ

Come posso creare tutte le directory padre mancanti?

Usa mkdir -p superiore/sottodirectory/destinazione. I nomi sono esempi da sostituire con il percorso desiderato.

Come posso evitare un errore quando la directory esiste già?

Usa -p. Il comando fallisce comunque se un componente richiesto è un file normale anziché una directory, oppure se non hai accesso al percorso.

mkdir -m imposta anche i permessi delle directory superiori create da -p?

No. -m imposta i permessi delle nuove directory indicate come argomenti. I componenti superiori creati automaticamente dipendono dalla umask, con scrittura e attraversamento per il proprietario; verifica o modifica separatamente i permessi quando necessario.

Come si crea una directory temporanea sicura?

Per una directory temporanea con nome unico e non prevedibile, usa mktemp -d e controlla che il comando riesca prima di utilizzare il percorso restituito. Un nome fisso creato con mkdir non offre la stessa protezione nelle aree temporanee condivise.

Documentazione di riferimento