Linux / Comando mkdir: criar diretórios, pais e permissões

mkdir cria diretórios. Use mkdir -p para criar também as pastas intermediárias ausentes e aceitar diretórios que já existam; use -m para escolher o modo dos novos diretórios indicados na linha de comando. A opção -p não corrige permissões de uma pasta existente nem garante que um caminho digitado esteja certo.

Os exemplos usam GNU Coreutils e Bash. Confira mkdir --version, mkdir --help e man mkdir no sistema utilizado. Prepare a área temporária abaixo antes dos comandos seguintes; a prática não precisa alterar diretórios do sistema nem usar privilégios de administrador.

O que é o comando mkdir?

Um diretório organiza nomes de arquivos e subdiretórios. Sem -p, o mkdir falha quando uma pasta intermediária não existe ou quando o nome final já está ocupado. Com -p, cria os componentes ausentes, mas ainda falha se um componente necessário estiver ocupado por um arquivo regular.

Sintaxe básica

mkdir [opções] diretório ...

Coloque caminhos com espaços entre aspas. No GNU, -- encerra a lista de opções, permitindo nomes que começam com hífen, como mkdir -- -dados. Caminhos relativos partem da pasta atual; caminhos absolutos partem da raiz.

Uso básico de mkdir

Criar um diretório

Execute este bloco completo no mesmo terminal Bash dos exemplos seguintes. Ele guarda a pasta inicial, cria uma área exclusiva com mktemp e entra nela antes de executar mkdir. Os passos ligados por && só continuam após sucesso. Pare se a preparação falhar. O segundo mkdir demonstra um caminho absoluto dentro da própria área, sem escrever em /srv.

mkdir_start=$PWD
mkdir_demo=$(mktemp -d "${TMPDIR:-/tmp}/mkdir-demo.XXXXXX") &&
cd -- "$mkdir_demo" &&
mkdir -- logs &&
mkdir -- "$mkdir_demo/myapp"

Criar vários diretórios

Cada nome é um argumento separado. O bloco cria src, tests e docs, além de uma única pasta chamada project files. Um segundo comando sem -p para um desses nomes falhará porque a pasta já existe.

mkdir -- src tests docs &&
mkdir -- 'project files'

Criar as pastas intermediárias

O primeiro comando cria a árvore project/src/components. O segundo usa expansão de chaves do Bash para criar três caminhos em myapp. As chaves ficam fora das aspas; essa expansão pertence ao shell e não ao mkdir. Repetir esses comandos com -p aceita os diretórios existentes, sem mudar seus modos.

mkdir -p -- project/src/components &&
mkdir -p -- "$mkdir_demo"/myapp/{bin,config,logs}

Conferir a árvore criada

Sem -v, o sucesso normalmente não gera mensagem. Crie uma árvore pequena e use find para listar somente diretórios:

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

Exemplo de saída:

demo-dir
demo-dir/logs

Na área nova, o exemplo lista as duas linhas acima. Para conferir os bits de permissão, use stat -c '%a %n' -- demo-dir demo-dir/logs. O guia de stat explica essa consulta; a existência da pasta, por si só, não comprova o modo, o dono ou a política de acesso desejados.

Opções principais

Opção Propósito
-p, --parents Criar pais ausentes e aceitar diretórios existentes, sem mudar seus modos.
-m MODE Escolher o modo dos novos diretórios nomeados na linha de comando.
-v Exibir uma mensagem para cada diretório criado.
-Z Ajustar o contexto SELinux ao tipo padrão da política, onde houver suporte.
--context=CONTEXT Aplicar um contexto SELinux ou SMACK específico em novas criações, onde houver suporte.

SELinux (Security-Enhanced Linux) e SMACK (Simplified Mandatory Access Control Kernel) aplicam políticas de acesso além dos bits comuns de permissão. As opções de contexto dependem do sistema e da política instalada; não substituem o planejamento das permissões. Com um contexto explícito e ambos os mecanismos desativados, o GNU emite um aviso. Verifique as extensões disponíveis antes de transportar um script para outra implementação.

Exemplos práticos

Escolher um modo numérico ou simbólico

Os três dígitos de 750 correspondem ao dono, ao grupo e aos demais usuários. Cada dígito combina leitura (4), escrita (2) e busca/entrada no diretório (1): o dono recebe rwx, o grupo r-x e os demais não recebem acesso. O modo simbólico u=rwx,go= solicita 700. Estes comandos só configuram diretórios novos; confira o modo e a propriedade reais, inclusive regras herdadas do pai.

mkdir -m 750 -- private-data &&
mkdir -m u=rwx,go= -- project-secret &&
stat -c '%a %n' -- private-data project-secret

Distinguir o modo final dos modos dos pais

umask é a máscara do processo que retira permissões de novas criações. No exemplo abaixo, a subshell entre parênteses limita a mudança de umask àquele bloco. Em um sistema Linux sem ACL padrão herdada nem bits especiais herdados, espera-se 750 em app e app/cache, e 700 no último diretório: -m 700 não se aplica aos pais criados por -p. A consulta mostra o resultado que realmente ocorreu.

(
  umask 027 &&
  mkdir -p -m 700 -- app/cache/data &&
  stat -c '%a %n' -- app app/cache app/cache/data
)

Segundo o manual GNU de mkdir, os pais criados por -p recebem permissões baseadas na umask com escrita e busca do dono habilitadas para permitir a criação dos filhos. A máscara 027 já permite esses dois bits. Pastas existentes não são alteradas. Para corrigir uma árvore real, revise cada caminho antes de um chmod; não aplique recursivamente um modo único a pastas compartilhadas sem conhecer sua finalidade.

Verificar falhas em um script

Salve o script completo abaixo como create-dirs.sh na área de prática e execute bash create-dirs.sh "$mkdir_demo/deploy/releases/current". Ele requer Bash, GNU mkdir e stat. Quantidade incorreta de argumentos ou caminho vazio retorna 2; falha na criação ou na consulta retorna 1. Ao funcionar, -v mostra os diretórios criados e stat mostra o modo, o dono/grupo e o caminho final. Repetir a chamada aceita a árvore existente, sem reconfigurá-la.

#!/usr/bin/env bash
if [ "$#" -ne 1 ] || [ -z "$1" ]; then
  printf '%s\n' 'Uso: bash create-dirs.sh DIRETORIO' >&2
  exit 2
fi
directory=$1
if ! mkdir -pv -- "$directory"; then
  printf '%s\n' 'Não foi possível preparar o diretório.' >&2
  exit 1
fi
stat -c '%A %U:%G %n' -- "$directory" || exit 1

A operação não é uma transação: uma falha pode deixar parte da árvore criada, e vários argumentos podem ter resultados diferentes. Inspecione o caminho antes de tentar novamente; o script não apaga diretórios para desfazer uma falha nem confirma todas as regras de acesso apenas com stat.

Comparar mkdir e comandos relacionados

Comando ou método Função principal Quando usar
mkdir Criar diretórios comuns Criar áreas de trabalho e árvores de pastas
install -d Criar diretórios e definir atributos Preparar diretórios e atributos para instalação
rmdir Remover diretórios vazios Remover apenas diretórios vazios
mktemp -d Criar um diretório temporário imprevisível Reservar uma área temporária com nome exclusivo

Cuidados importantes

-p também aceita um caminho digitado incorretamente

Uma grafia errada também pode virar uma árvore nova com -p. Confira a pasta atual, o conteúdo das variáveis e o caminho final. O sucesso de mkdir -p não valida que você escolheu a localização pretendida, que um caminho não passa por links simbólicos ou que o serviço terá acesso.

Considerar umask, ACL e herança

Sem -m e sem ACL padrão, os bits comuns partem de 777 e são restringidos pela umask: por exemplo, 022 normalmente resulta em 755. ACL significa lista de controle de acesso. No Linux, uma ACL padrão do pai muda as regras de criação e pode ser herdada; o grupo e o bit setgid (set group ID, que faz novas subpastas herdarem o grupo) também podem vir do pai. Por isso, um cálculo só com a umask não descreve toda a política. Consulte a documentação Linux de umask e ACL padrão e confira o resultado no sistema de destino.

A criação depende das permissões do diretório pai

Criar uma pasta exige escrita no pai e permissão de busca, representada por x, nos componentes necessários do caminho. Uma falha também pode indicar sistema de arquivos somente leitura, espaço esgotado ou cota excedida. A documentação Linux de mkdir relaciona essas condições. Leia o diagnóstico antes de alterar permissões ou usar privilégios maiores.

Ao concluir a prática, volte à pasta inicial com cd -- "$mkdir_start". A área temporária permanece disponível para inspeção. Para uma área temporária real de script, prefira mktemp -d a um nome fixo que possa colidir com arquivos de outra execução.

Perguntas frequentes

Como criar todos os diretórios pais que estão faltando?

Use mkdir -p -- pai/filho/destino. Ele cria os componentes ausentes se o caminho e as permissões permitirem.

Como evito um erro quando o diretório já existe?

Use -p. Ainda assim falha se o caminho estiver ocupado por algo que não seja um diretório.

O mkdir -m aplica o mesmo modo aos diretórios-pai criados com -p?

Não. No GNU, -m só vale para diretórios novos indicados como argumentos, não para os pais que -p precisa criar. Controle a umask, observe ACL e herança e confira os modos efetivos.

Devo usar mkdir para diretórios temporários seguros?

Para um nome único e imprevisível em uma área temporária, use mktemp -d e verifique seu retorno. Um mkdir com nome fixo pode colidir com um caminho já existente.

Documentação oficial