Linux / Comando mv: mover arquivos e renomear caminhos

mv move arquivos e diretórios ou muda seus nomes. Se o destino já for uma pasta, o arquivo vai para dentro dela; se for um novo caminho, esse passa a ser o nome da origem. Confira o destino e a política de sobrescrita antes de executar, pois uma substituição pode descartar o conteúdo anterior.

Os exemplos usam Bash e GNU Coreutils. Confira mv --version, mv --help e man mv no sistema de destino: opções e status de saída variam entre versões e plataformas. Prepare a área temporária abaixo e mantenha o mesmo terminal durante a prática.

O que é o comando mv?

Dentro do mesmo sistema de arquivos, o GNU normalmente renomeia a entrada, sem copiar todos os bytes. Entre sistemas de arquivos, ele pode recorrer à cópia e remover a origem depois que essa cópia tiver sucesso. Por isso, mover um arquivo grande entre dispositivos pode exigir tempo e espaço livre. A política exata está no manual GNU de mv.

Sintaxe básica

mv [opções] [-T] origem destino
mv [opções] origem ... diretório
mv [opções] -t diretório origem ...

origem, destino e diretório são marcadores, não nomes prontos para execução. Coloque caminhos com espaços entre aspas. No GNU, -- encerra a leitura de opções antes dos nomes, inclusive nomes que começam com hífen. -t requer uma pasta receptora existente e não pode ser combinado com -T.

Uso básico do mv

Renomear um arquivo

Execute o bloco inteiro para guardar a pasta inicial, criar uma área exclusiva e preparar todos os arquivos. Os passos com && só continuam se o anterior funcionar; pare se houver erro. A última linha renomeia draft.txt para final.txt. Nenhum exemplo precisa alterar uma configuração real em /etc.

mv_start=$PWD
mv_demo=$(mktemp -d "${TMPDIR:-/tmp}/mv-demo.XXXXXX") &&
cd -- "$mv_demo" &&
mkdir -p -- archive old-logs config staging/sub destination-dir &&
printf '%s\n' 'Rascunho de teste.' > draft.txt &&
printf '%s\n' 'Relatório de teste.' > report.txt &&
printf '%s\n' 'lote a' > batch-a.log &&
printf '%s\n' 'lote b' > batch-b.log &&
printf '%s\n' 'app' > app.log &&
printf '%s\n' 'acesso' > access.log &&
printf '%s\n' 'erro' > error.log &&
printf '%s\n' 'nova i' > new-i.conf &&
printf '%s\n' 'antiga i' > config/config-i.conf &&
printf '%s\n' 'nova b' > new-b.conf &&
printf '%s\n' 'antiga b' > config/config-b.conf &&
printf '%s\n' 'arquivo 1' > file1 &&
printf '%s\n' 'arquivo 2' > file2 &&
printf '%s\n' 'dado da pasta' > staging/sub/data.txt &&
printf '%s\n' 'conteúdo para verificar' > transfer.txt &&
mv -- draft.txt final.txt

Mover um arquivo para um diretório

A preparação criou archive. O comando abaixo move o relatório para archive/report.txt, preservando o nome base. Depois do sucesso, report.txt deixa de existir na pasta inicial da prática. Se a pasta receptora faltar, uma sintaxe com barra final falha; mv não cria automaticamente os diretórios pais. Para isso, use mkdir antes de mover.

mv -- report.txt archive/

Mover vários arquivos

Execute as duas linhas separadamente. O Bash expande batch-*.log para os dois arquivos preparados com esse prefixo. A segunda linha usa outro conjunto de arquivos, que ainda existe, e -t declara a pasta receptora antes das origens. Assim, uma linha não tenta mover arquivos já consumidos pela anterior.

mv -- batch-*.log old-logs/
mv -t old-logs -- app.log access.log error.log

Confirmar o resultado

Sem -v, uma operação bem-sucedida normalmente não imprime nada. Neste exemplo, só confirme a renomeação depois que o comando tiver funcionado e os testes de caminho forem verdadeiros:

printf 'demo\n' > before.txt &&
mv -- before.txt after.txt &&
test -f after.txt && test ! -e before.txt &&
printf '%s\n' 'A origem foi renomeada para after.txt.'

O resultado esperado é A origem foi renomeada para after.txt. Essa checagem constata a presença do novo arquivo e a ausência do antigo. Para dados importantes, compare também o conteúdo com uma referência ou um hash obtido antes da movimentação, como no script adiante. Uma mensagem de -v isolada não é prova de sucesso: o GNU pode anunciar a tentativa antes de concluí-la.

Opções principais

Opção Propósito
-i Pedir confirmação antes de sobrescrever.
-n Pular um destino existente; confira a versão e o status, sem presumir que houve movimento.
-f Não pedir confirmação; não contorna permissões nem mescla diretórios não vazios.
-u Pular um arquivo não diretório se o destino tiver mtime igual ou mais recente, nas condições documentadas.
-v Anunciar os caminhos envolvidos; conferir também status e resultado.
-b Guardar a versão anterior do destino antes de substituí-lo.
-T Tratar o último argumento como caminho exato, sem acrescentar o nome da origem.
-t DIR Usar a pasta indicada como receptora das origens.

O -u comum compara mtime, o horário de modificação, e não calcula hashes para descobrir conteúdo diferente. A documentação GNU atual desaconselha -n por diferenças de status entre plataformas. --update=none pula destinos existentes sem falhar por esse motivo; --update=none-fail, introduzido no Coreutils 9.5, também diagnostica e retorna falha ao pulá-los. As notas oficiais de versão registram mudanças de -n nas versões 9.x. Status 0 não garante que todos os arquivos saíram da origem.

Exemplos práticos

Confirmar substituições e manter uma versão anterior

Execute as linhas separadamente na área preparada. A primeira pergunta se deve substituir config/config-i.conf: responda conforme a intenção; recusar mantém a origem. A segunda usa outro arquivo e mantém o destino antigo em config/config-b.conf.~1~. A opção --backup=numbered pede numeração explicitamente, sem depender da variável VERSION_CONTROL. Se combinar -i, -f e -n, apenas a última dessas três opções determina esse comportamento no GNU.

mv -iv -- new-i.conf config/config-i.conf
mv -v --backup=numbered -- new-b.conf config/config-b.conf

Torne o destino inequívoco

Com -T, staging passa a ser exatamente current, sem criar current/staging. Nesta prática, current ainda não existe. Isso não é proteção contra sobrescrita: um diretório de destino vazio pode ser substituído, enquanto um destino não vazio não é mesclado como em uma cópia recursiva. A segunda linha move dois arquivos independentes para a pasta archive.

mv -T -- staging current
mv -t archive -- file1 file2

Planejar a transferência e verificar os bytes

Antes de mover para outro sistema de arquivos, confira o espaço disponível e se a pasta montada é realmente o destino pretendido. Salve o script abaixo como move-verify.sh e execute bash move-verify.sh "$mv_demo/transfer.txt" "$mv_demo/destination-dir". Ele requer Bash, GNU mv, df e sha256sum; aceita um arquivo regular que não seja link e uma pasta existente. A prática usa duas pastas temporárias e, sozinha, não demonstra uma transferência entre sistemas de arquivos.

#!/usr/bin/env bash
if [ "$#" -ne 2 ]; then
  printf '%s\n' 'Uso: bash move-verify.sh ORIGEM PASTA' >&2
  exit 2
fi
source=$1
directory=$2
if [ ! -f "$source" ] || [ -L "$source" ] || [ ! -d "$directory" ]; then
  printf '%s\n' 'Informe um arquivo regular sem link e uma pasta existente.' >&2
  exit 1
fi
target=$directory/${source##*/}
df -h -- "$source" "$directory" || exit 1
before=$(sha256sum < "$source") || exit 1
mv -nT -- "$source" "$target" || exit 1
if [ -e "$source" ] || [ -L "$source" ]; then
  printf '%s\n' 'A origem permaneceu; o arquivo não foi movido.' >&2
  exit 1
fi
after=$(sha256sum < "$target") || exit 1
if [ "$before" != "$after" ]; then
  printf '%s\n' 'Os hashes não coincidem.' >&2
  exit 1
fi
printf 'Arquivo movido e hash confirmado: %s\n' "$target"

O script mede o hash SHA-256 (Secure Hash Algorithm de 256 bits) antes e depois, exige que a origem tenha desaparecido e só então confirma. Uso incorreto retorna 2; entrada inválida, arquivo pulado, falha de movimento ou de verificação retorna 1. Ele usa -nT para manter compatibilidade com versões GNU mais antigas e detecta explicitamente a origem que permaneceu, sem confiar no status de -n. Verifique os caminhos antes de executá-lo com dados reais; não é proteção contra alterações concorrentes.

A verificação posterior não mantém uma cópia de segurança: quando mv termina, ele já pode ter removido a origem. Se o hash final falhar ou divergir, o script relata o problema, mas não restaura o original. Se precisar conservar a origem até aprovar a cópia, use cp com comparação de conteúdo e decida a remoção depois.

Comparar mv e comandos relacionados

Comando ou método Função principal Quando usar
mv Mover ou renomear O caminho de origem deve desaparecer após sucesso
cp Criar uma cópia independente Origem e cópia devem permanecer
rename Renomeação em lote baseada em regras Há muitos nomes a transformar; confira qual implementação está instalada
rsync --remove-source-files Transferir e remover arquivos já duplicados com sucesso Planejar transferências locais ou remotas; diretórios de origem não são removidos por essa opção

No rsync com --remove-source-files, apenas arquivos transferidos e duplicados com sucesso são removidos da origem, não os diretórios. Use essa opção com arquivos que não estejam sendo escritos; ela não equivale a uma renomeação simples de toda a árvore.

Cuidados importantes

Uma substituição não passa pela lixeira

Sobrescrever um destino pode destruir seu conteúdo anterior sem uma entrada na lixeira do desktop. Confirme os caminhos e escolha uma política de confirmação, não substituição ou backup. -f não concede permissões que o usuário não possui. Para desfazer uma simples renomeação sem substituição, você pode mover o novo caminho de volta ao anterior, depois de verificar que esse caminho está disponível.

Movimentos entre sistemas de arquivos podem ter sucesso parcial

Mover vários itens não é uma transação única. Um arquivo anterior pode já ter chegado ao destino quando outro falha; não presuma reversão automática. Inspecione os dois lados e o diagnóstico antes de repetir. Entre sistemas de arquivos, a cópia também precisa lidar com atributos e suporte do destino; arquivos com o mesmo conteúdo não comprovam permissões, dono ou atributos estendidos iguais.

Evite uma barra final em um link simbólico de diretório de origem

Quando quer mover o próprio link simbólico para uma pasta, evite acrescentar uma barra ao caminho desse link. O tratamento dessa barra difere entre sistemas e pode causar erro ou operar sobre o diretório apontado. Verifique qual objeto está selecionado. Ao terminar a prática, volte com cd -- "$mv_start"; a pasta temporária permanece disponível para inspeção.

Perguntas frequentes

O comando mv copia dados dentro do mesmo sistema de arquivos?

Geralmente, ele realiza uma renomeação rápida. Cruzar a fronteira de um sistema de arquivos pode exigir cópia e remoção da origem.

Como evito sobrescrever um destino?

Para interpretar comandos existentes, -n impede substituição, mas seu status depende da plataforma e da versão. Na automação GNU atual, confira --update=none ou --update=none-fail e o suporte instalado; -i pede confirmação. Verifique também o resultado efetivo.

Renomear e mover são comandos diferentes?

Ambos usam mv SOURCE DESTINATION; o tipo e a localização do destino determinam o resultado.

Como posso mover claramente muitos arquivos para um diretório?

Use mv -t DIRECTORY -- FILE....

Documentação oficial