Linux / Comando rmdir: remover diretórios vazios e seus pais
rmdir remove somente diretórios vazios: arquivos, itens ocultos ou subpastas fazem a operação falhar. A opção -p tenta remover também os pais que ficarem vazios. Ela é diferente de rm -r, que remove uma árvore com seu conteúdo; escolha o alvo e o limite da operação antes de executar qualquer remoção.
Os exemplos usam GNU Coreutils e Bash. Confira rmdir --version, rmdir --help e man rmdir no destino. Prepare a área temporária abaixo e faça os exercícios somente nela; os nomes de prática não são pastas de um serviço real.
O que é o comando rmdir?
Um diretório está vazio quando não contém entradas além das especiais . e ... Mesmo uma subpasta vazia ou um arquivo de 0 bytes impede sua remoção com rmdir. O comando também não é usado para apagar arquivos regulares. Essa restrição preserva conteúdo, mas não verifica se você escolheu a pasta certa.
Sintaxe básica
rmdir [opções] diretório ...
Coloque caminhos com espaços entre aspas. No GNU, -- encerra as opções e permite nomes com hífen inicial, como rmdir -- -cache. Confira a pasta atual antes de usar um caminho relativo.
Uso básico do rmdir
Remover um diretório vazio
Execute o bloco completo no mesmo terminal Bash usado pelos exemplos seguintes. Ele guarda a pasta inicial, cria uma área exclusiva com mktemp, entra nela e prepara os alvos. O arquivo oculto hidden-cache/.keep será preservado para a comparação posterior. A sequência && só continua se cada passo funcionar. Se a preparação falhar, pare antes de seguir.
rmdir_start=$PWD
rmdir_demo=$(mktemp -d "${TMPDIR:-/tmp}/rmdir-demo.XXXXXX") &&
cd -- "$rmdir_demo" &&
mkdir -p -- old-cache empty-a empty-b empty-c a/b/c hidden-cache cache-dir build/tmp/session &&
printf '%s\n' 'preservar este arquivo' > hidden-cache/.keep &&
rmdir -- old-cache
Remover vários diretórios vazios
Os três diretórios vazios foram criados na preparação. Cada argumento é processado; se um deles falhar, os outros ainda podem ser removidos. Não há desfazer automático nem garantia de que todos os alvos permaneçam após uma falha parcial.
rmdir -- empty-a empty-b empty-c
Remover diretórios pai vazios
Na área preparada, este comando tenta remover a/b/c, depois a/b e por fim a. O argumento relativo termina em a; ele não inclui a própria pasta temporária. Se um pai contiver outro item, esse pai permanece e o comando normalmente retorna falha, embora o filho já possa ter sido removido.
rmdir -p -- a/b/c
Conferir a remoção
Sem -v, uma remoção bem-sucedida normalmente não imprime mensagem. O exemplo abaixo cria um alvo novo dentro da área temporária, exige que a criação e a remoção funcionem e só então imprime a confirmação:
mkdir -- empty-demo &&
rmdir -- empty-demo &&
test ! -e empty-demo &&
printf '%s\n' 'O diretório vazio foi removido.'
A saída esperada é O diretório vazio foi removido. A confirmação depende de toda a cadeia de comandos; uma consulta isolada test ! -e caminho apenas testa ausência e não comprova que um rmdir anterior funcionou. Em operações reais, o estado do caminho ainda pode mudar entre duas consultas.
Opções principais
| Opção | Propósito |
|---|---|
-p, --parents |
Remover o alvo e tentar seus componentes pais, de baixo para cima. |
-v |
Exibir o andamento dos diretórios processados; conferir também o status e os diagnósticos. |
--ignore-fail-on-non-empty |
Ignorar falhas por diretório não vazio, inclusive seu efeito no status de saída. |
Com --ignore-fail-on-non-empty, um diretório com conteúdo pode permanecer e ainda assim o comando retornar 0. Essa opção não significa que o alvo foi removido nem ignora todos os tipos de falha, como um caminho inexistente. O manual GNU de rmdir descreve esse efeito. Verifique as opções disponíveis ao transportar scripts para outra implementação.
Exemplos práticos
Encontrar itens ocultos
A pasta old-cache já foi removida no primeiro exemplo. Para inspecionar um alvo que tem conteúdo, use hidden-cache, preparado com .keep. ls -la inclui itens ocultos e find mostra as entradas do primeiro nível. O guia de ls explica a listagem.
ls -la -- hidden-cache
find hidden-cache -mindepth 1 -maxdepth 1 -print
Preservar conteúdo e informar falhas no script
Salve o script completo como remove-empty.sh na área de prática e execute bash remove-empty.sh "$rmdir_demo/cache-dir". Ele requer Bash e rmdir. A quantidade incorreta de argumentos ou um caminho vazio retorna 2. Um alvo vazio é removido e gera uma confirmação; uma falha mantém o diagnóstico original e retorna seu status, sem tentar uma exclusão recursiva.
#!/usr/bin/env bash
if [ "$#" -ne 1 ] || [ -z "$1" ]; then
printf '%s\n' 'Uso: bash remove-empty.sh DIRETORIO' >&2
exit 2
fi
directory=$1
if rmdir -- "$directory"; then
printf 'Diretório vazio removido: %s\n' "$directory"
else
rmdir_status=$?
printf 'Não removido (status %s): %s\n' "$rmdir_status" "$directory" >&2
exit "$rmdir_status"
fi
Para comparar, execute bash remove-empty.sh "$rmdir_demo/hidden-cache": o arquivo .keep impede a remoção. O mesmo ramo de falha também pode indicar falta de permissão ou outro problema; o script não chama toda falha de “diretório com conteúdo”. Ele não modifica o alvo para forçar uma nova tentativa.
Acompanhar a remoção de pais
O bloco de preparação também criou build/tmp/session. A chamada abaixo tenta remover esses três componentes e mostra o andamento. Confira o status e a situação final: uma mensagem com -v pode anunciar uma tentativa e não deve ser tratada, sozinha, como comprovante de remoção. O código-fonte oficial de rmdir emite o diagnóstico verboso antes da tentativa.
rmdir -pv -- build/tmp/session
Comparar rmdir e outras formas de remoção
| Comando ou método | Função principal | Quando usar |
|---|---|---|
rmdir |
Remover apenas diretórios vazios | Remover uma pasta conhecida sem apagar conteúdo |
rm -d |
Remover diretórios vazios com GNU rm | Operar no contexto de GNU rm, que também aceita arquivos |
rm -r |
Excluir uma árvore de diretórios recursivamente | Remover deliberadamente a árvore e todos os dados nela |
find -empty -delete |
Encontrar e remover entradas vazias correspondentes | Selecionar por regras; sem -type d, também pode selecionar arquivos vazios |
A expressão da tabela com find é uma comparação, não um comando completo para copiar: é preciso definir o ponto inicial e os filtros. Se o objetivo for só diretórios, inclua -type d; -delete implica processamento em profundidade. Confira primeiro a seleção com -print sob o mesmo -depth. A documentação GNU de -delete explica a ordem das ações.
Cuidados importantes
Arquivos ocultos contam como conteúdo
Arquivos como .keep e .gitignore tornam um diretório não vazio.
Definir até onde -p pode subir
O comando não recebe um parâmetro “pare neste pai”. Em um caminho absoluto ou relativo mais longo, os componentes extras também entram nas tentativas. Se uma pasta deve permanecer, prefira chamar rmdir sem -p para os alvos explicitamente escolhidos. Remover um filho antes de falhar no pai não é revertido automaticamente.
A falha pode ser uma informação útil
Uma pasta não vazia é apenas uma das causas. No Linux, a remoção exige escrita no pai e busca nos componentes do caminho; sticky bit (que limita quem pode remover itens em uma pasta compartilhada), sistema de arquivos somente leitura e ponto de montagem podem impedir a operação. Essas condições estão na documentação Linux de rmdir. Preserve o diagnóstico para escolher a próxima ação, em vez de esconder todos os erros.
Ao terminar os exercícios, volte à pasta inicial com cd -- "$rmdir_start". A área temporária permanece para inspeção, inclusive o arquivo oculto preservado. O guia de mkdir explica a criação e os modos das pastas usadas nesse tipo de prática.
Perguntas frequentes
O rmdir pode remover um diretório que contém arquivos?
Não. Use um rm -r cuidadosamente revisado apenas quando todo o conteúdo deve ser deletado.
Por que um diretório aparentemente vazio não pode ser removido?
Ele pode conter entradas ocultas, ser um ponto de montagem ou ter um problema de permissão.
Como faço para remover também os diretórios pais vazios?
Use rmdir -p -- caminho, depois de revisar todos os componentes que poderão ser removidos. Cada nível precisa estar vazio; uma falha no pai não restaura os filhos já removidos.
rmdir é mais seguro do que rm -r?
É mais restritivo porque recusa diretórios não vazios, mas o caminho de destino ainda deve ser verificado.




