Linux / Comando rm: remover arquivos e limitar exclusões recursivas

rm remove os nomes de arquivos do sistema de arquivos; com -r, também remove diretórios e seu conteúdo. Ele normalmente não envia os itens à lixeira e não oferece um comando de desfazer. Antes de executar, confira o caminho completo e use apenas as opções necessárias, sobretudo em uma remoção recursiva.

Os exemplos usam Bash e GNU Coreutils. Confira rm --version, rm --help e man rm na máquina de destino, pois extensões GNU podem faltar em outros sistemas. Faça a prática na área temporária criada abaixo e mantenha o mesmo terminal; os arquivos são descartáveis e não exigem privilégios administrativos.

O que é o comando rm?

Uma entrada de diretório associa um nome a um arquivo. No Linux, apagar um nome não libera necessariamente o espaço imediatamente: outros links físicos ou processos com o arquivo aberto podem mantê-lo acessível. A liberação ocorre após o último link e a última referência aberta desaparecerem, conforme unlink no manual de chamadas do Linux. Isso também não comprova que os bytes foram sobrescritos. Sem -r ou -d, o GNU rm não remove diretórios.

Sintaxe básica

rm [opções] arquivo ...

Os termos opções e arquivo são marcadores da sintaxe. Coloque caminhos com espaços entre aspas. No GNU, -- encerra as opções antes dos nomes, inclusive os que começam com hífen. Confira os operandos já expandidos pelo shell: rm recebe esses nomes, não a intenção que você tinha ao escrever o padrão.

Uso básico do rm

Remover um arquivo

Execute o bloco inteiro para guardar a pasta inicial, criar uma área exclusiva e preparar todos os exemplos. Os passos ligados por && param no primeiro erro. As duas últimas linhas removem somente os arquivos descartáveis old-report.txt e -temporary.txt, criados dentro dessa área. Pare se a preparação falhar.

rm_start=$PWD
rm_demo=$(mktemp -d "${TMPDIR:-/tmp}/rm-demo.XXXXXX") &&
cd -- "$rm_demo" &&
mkdir -p -- build-cache/sub old-release/sub preview-cache mount-demo/sub &&
printf '%s\n' 'relatório descartável' > old-report.txt &&
printf '%s\n' 'arquivo com hífen' > ./-temporary.txt &&
printf '%s\n' 'temporário 1' > first.tmp &&
printf '%s\n' 'temporário 2' > second.tmp &&
printf '%s\n' 'oculto preservado' > .hidden.tmp &&
printf '%s\n' 'cache descartável' > build-cache/sub/item.txt &&
printf '%s\n' 'versão descartável' > old-release/sub/item.txt &&
printf '%s\n' 'só para inspeção' > preview-cache/item.txt &&
printf '%s\n' 'árvore descartável' > mount-demo/sub/item.txt &&
printf '%s\n' 'configuração de teste' > important.conf &&
rm -- old-report.txt &&
rm -- -temporary.txt

Remover vários arquivos correspondentes

Na área preparada, o padrão ./*.tmp seleciona ./first.tmp e ./second.tmp. Execute primeiro a linha de visualização e confira cada nome; só então execute a remoção. O formato Bash %q mostra os nomes com escapes, tornando espaços e quebras de linha identificáveis. Essa listagem não congela a pasta: se outro processo a alterar, a expansão posterior pode ser diferente.

printf '%q\n' ./*.tmp
rm -- ./*.tmp

Com as opções padrão do Bash, * não inclui nomes iniciados por ponto: .hidden.tmp permanecerá nesta prática. Se não houver correspondência e nullglob estiver desligado, o padrão literal é passado ao comando; failglob pode impedir a execução. Essas regras estão na documentação de expansão de nomes do Bash. Não acrescente -f apenas para esconder um diagnóstico que você ainda não entendeu.

Remover uma árvore de diretórios

Dentro da área de prática, a preparação criou build-cache/sub/item.txt. Liste toda a árvore, confirme que o caminho é o correto e só depois execute a linha com -r. A listagem inclui os arquivos ocultos da árvore, se existirem; a remoção recursiva da pasta não depende do padrão *. Para remover apenas uma pasta vazia, prefira rmdir.

find build-cache -print
rm -r -- build-cache

Confirmar uma remoção silenciosa

A ausência de saída não comprova por si só que o caminho foi removido. O bloco cria um arquivo conhecido e só imprime a confirmação depois de uma remoção bem-sucedida e de testes de ausência:

printf 'demo\n' > disposable-demo.txt &&
rm -- disposable-demo.txt &&
test ! -e disposable-demo.txt && test ! -L disposable-demo.txt &&
printf '%s\n' 'O arquivo de demonstração foi removido.'

A mensagem esperada é O arquivo de demonstração foi removido. O teste ! -e sozinho também é verdadeiro para um link simbólico sem alvo; por isso o exemplo inclui ! -L. Status 0 pode ocorrer com itens mantidos após uma resposta negativa ou com um arquivo ausente ignorado por -f. Verifique o resultado e o diagnóstico, não apenas o último status.

Opções principais

Opção Propósito
-r, -R Remover uma pasta e seu conteúdo recursivamente.
-i Pedir confirmação para cada remoção; recusar mantém o item.
-I Pedir uma vez se houver mais de três operandos ou se a remoção for recursiva.
-f Ignorar arquivos inexistentes e a ausência de operandos; não pedir confirmação.
-d Remover diretórios vazios, sem remover recursivamente seu conteúdo.
-v Anunciar os itens processados; conferir também status e resultado.
--one-file-system Na recursão, não descer em diretórios de sistema de arquivos diferente do operando correspondente.
--preserve-root[=all] Proteger / na recursão por padrão; com =all, também rejeitar operandos em sistema de arquivos diferente do pai.

-f não concede permissões, não desativa por si só a proteção padrão de / e não torna recuperável o que foi removido. As opções interativas e -f podem substituir escolhas anteriores conforme a ordem; não misture opções contraditórias contando com um aviso. O manual GNU de rm detalha essas regras e as proteções. Opções como --one-file-system são extensões que precisam existir na plataforma de destino.

Exemplos práticos

Conferir uma variável de caminho

Inicialize a variável com uma pasta específica que ainda existe, normalize seu caminho e liste o conteúdo. realpath -e exige que os componentes existam e resolve links simbólicos; confira se o resultado está realmente dentro da área pretendida. O bloco abaixo só inspeciona preview-cache, sem removê-la. Não transforme uma saída de find -print em uma lista de argumentos separando por espaços ou linhas: nomes também podem conter esses caracteres.

target="$rm_demo/preview-cache"
target=$(realpath -e -- "$target") &&
printf 'target=%q\n' "$target" &&
find "$target" -print

Usar salvaguardas interativas

Execute as duas linhas separadamente. -i pergunta pelo arquivo important.conf. -I, combinado com -r, pede uma confirmação para toda a árvore old-release, incluindo os descendentes; não pergunta por cada item. Responder negativamente mantém os dados, mas o comando pode retornar 0. A automação precisa de verificações próprias de escopo e de resultado.

rm -i -- important.conf
rm -Ir -- old-release

Limitar uma árvore e respeitar sistemas de arquivos

--one-file-system compara os sistemas de arquivos encontrados na recursão com o do operando inicial. Ele pode pular uma montagem diferente e deixar parte da árvore, mas não protege uma montagem vinculada ao mesmo sistema de arquivos. --preserve-root=all também recusa um operando cujo sistema de arquivos difere do pai; não é uma lista de pastas permitidas. No Linux, examine as montagens, por exemplo com findmnt, antes de aplicar a remoção a uma árvore real.

Salve o script completo abaixo como remove-tree.sh. Na prática, execute bash remove-tree.sh "$rm_demo" "$rm_demo/mount-demo". Ele requer Bash e GNU realpath, find e rm, recusa argumentos vazios, a raiz /, a própria pasta base, caminhos fora dela e um link simbólico como alvo final. A base e o alvo devem existir como pastas; os pais são resolvidos antes da comparação. A saída de realpath -z termina em NUL, um byte de valor zero, e é lida com read -d '' para não perder quebras de linha em nomes. Uso incorreto retorna 2 e as recusas ou falhas retornam 1.

#!/usr/bin/env bash
if [ "$#" -ne 2 ] || [ -z "$1" ] || [ -z "$2" ]; then
  printf '%s\n' 'Uso: bash remove-tree.sh BASE ALVO' >&2
  exit 2
fi
candidate=$2
while [[ $candidate == */ && $candidate != / ]]; do
  candidate=${candidate%/}
done
if [ -L "$candidate" ]; then
  printf '%s\n' 'O alvo final não pode ser um link simbólico.' >&2
  exit 1
fi
IFS= read -r -d '' base_dir < <(realpath -ze -- "$1") || exit 1
IFS= read -r -d '' target < <(realpath -ze -- "$candidate") || exit 1
if [ "$base_dir" = / ] || [ ! -d "$base_dir" ] || [ ! -d "$target" ]; then
  printf '%s\n' 'Base ou alvo inválido.' >&2
  exit 1
fi
case "$target" in
  "$base_dir"/*) ;;
  *) printf '%s\n' 'O alvo deve ficar abaixo da base, sem ser a própria base.' >&2; exit 1 ;;
esac
printf 'Base: %q\nAlvo: %q\n' "$base_dir" "$target"
find "$target" -print || exit 1
rm -Ir --one-file-system --preserve-root=all -- "$target" || exit 1
if [ -e "$target" ] || [ -L "$target" ]; then
  printf '%s\n' 'O alvo permanece; verifique a confirmação e os diagnósticos.' >&2
  exit 1
fi
printf '%s\n' 'A árvore de teste foi removida.'

O script mostra os caminhos absolutos e a árvore antes da confirmação. Se você recusar ou alguma montagem for preservada, ele não imprime sucesso enquanto o alvo ainda existir. Essa checagem reduz erros comuns, mas não elimina mudanças concorrentes entre verificar e remover, e não restaura uma exclusão parcial. Use uma área sob seu controle e revise a pasta base, não apenas o alvo. A pasta chamada mount-demo é apenas uma árvore de teste, sem criar montagens.

Comparar rm e comandos relacionados

Comando ou método Função principal Quando usar
rm Remover arquivos e árvores de diretórios Remover nomes e árvores sem um desfazer integrado
rmdir Remover apenas diretórios vazios Manter a pasta quando ela ainda contiver dados
Utilitário de lixeira Mover itens para um local recuperável Ter uma forma de restauração oferecida pela ferramenta
shred Tentar sobrescrever dados de arquivos Avaliar sobrescrita em condições compatíveis, sem garantia geral de apagar todas as cópias

rm não é uma ferramenta de sanitização de mídia. O manual GNU de shred explica que SSDs (unidades de estado sólido), copy-on-write (gravação em novos blocos), snapshots (capturas de um estado anterior) e cópias de backup podem impedir que uma sobrescrita elimine todas as versões dos dados. Não interprete a ausência de um nome como prova de irrecuperabilidade.

Cuidados importantes

Não use rm -rf por hábito

A recursão amplia o conjunto de itens e -f reduz confirmações e diagnósticos de ausência. Uma variável vazia pode fazer uma expressão construída com ela apontar para um lugar inesperado; aspas preservam os argumentos, mas não validam seu significado. Exija um caminho não vazio, resolva-o e verifique a relação com uma base permitida antes de remover. A proteção de / não protege automaticamente cada pasta importante.

Não confie em um alias como a única proteção

Um alias interativo como alias rm='rm -i' pode não existir em scripts, em outro sistema ou em outra sessão. Não use o alias como garantia de confirmação. Confira o comando realmente executado e baseie o procedimento em escopo revisado, permissões adequadas e cópias de segurança.

Não presuma recuperação fácil

Não existe garantia de recuperar um arquivo removido: reutilização de espaço, comportamento do dispositivo e cópias disponíveis afetam o resultado. Evite novas gravações no armazenamento afetado e use um procedimento de recuperação ou backup adequado. Para dados importantes, verifique a cópia de segurança antes de excluir a origem. Ao terminar a prática, volte com cd -- "$rm_start"; os arquivos restantes ficam disponíveis para inspeção.

Perguntas frequentes

O comando rm envia arquivos para a lixeira?

Normalmente não. O rm no terminal ignora a lixeira da área de trabalho.

Qual opção remove um diretório com conteúdo?

Use -r somente após verificar que toda a árvore deve ser removida. Use rmdir para um diretório vazio.

Qual é a diferença entre -i e -I?

-i pergunta por cada remoção. No GNU, -I pergunta uma vez quando há mais de três operandos ou quando se usa uma opção recursiva. Recusar pode manter os itens com status 0; confirme o resultado.

Posso recuperar imediatamente um arquivo deletado pelo rm?

A recuperação não é garantida. Reduza novas gravações e siga um procedimento de recuperação ou backup apropriado ao sistema de arquivos.

Documentação oficial