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.




