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....




