O Comando `mv` do Linux: Referência Técnica Completa e Guia de Uso Avançado
O comando mv no Linux move ou renomeia ficheiros e diretórios atualizando os metadados do sistema de ficheiros — especificamente a entrada de diretório — sem copiar dados quando opera dentro do mesmo sistema de ficheiros. Isto torna-o uma operação atómica e quase instantânea para movimentos na mesma partição, independentemente do tamanho do ficheiro.
Compreender esta distinção separa os utilizadores casuais dos administradores que conseguem diagnosticar por que razão um movimento entre dois pontos de montagem se comporta de forma diferente de um dentro de uma única partição, por que certas operações mv desencadeiam I/O de disco enquanto outras não, e como utilizar o comando com segurança em ambientes de produção onde a integridade dos dados é inegociável.
O que o Comando mv Realmente Faz Internamente
Quando executa mv source destination no mesmo sistema de ficheiros, o kernel chama rename(2) — uma única chamada de sistema que reatribui atomicamente a entrada de diretório. Nenhum dado é lido ou escrito no disco. O número de inode permanece idêntico; apenas o caminho muda.
Quando a origem e o destino residem em sistemas de ficheiros diferentes (partições diferentes, montagens NFS ou bind mounts), mv recorre a uma sequência de copiar-e-eliminar: lê os dados de origem, escreve-os no destino e desvincula a origem apenas após uma escrita bem-sucedida. Isto tem implicações críticas:
- Movimentos entre sistemas de ficheiros interrompidos podem deixar uma cópia parcial no destino e o original intacto na origem, ou — em cenários de pior caso — eliminar a origem antes de a escrita ser concluída.
- Movimentos de ficheiros grandes entre sistemas de ficheiros consomem largura de banda de I/O e tempo proporcional ao tamanho do ficheiro.
- Permissões e propriedade podem não ser transferidas corretamente se o sistema de ficheiros de destino não suportar o mesmo modelo de permissões (por exemplo, FAT32, algumas partilhas de rede).
Esta diferença de comportamento é invisível na sintaxe do comando, mas fundamental para as decisões de administração de sistemas em servidores que executam VPS Hosting ou Servidores Dedicados com múltiplos pontos de montagem.
Sintaxe e Opções Principais
mv [OPTIONS] SOURCE DESTINATION
mv [OPTIONS] SOURCE... DIRECTORYArgumentos:
SOURCE— Um ou mais ficheiros ou diretórios a mover ou renomear.DESTINATION— O caminho de destino. Se for um diretório existente, a origem é colocada dentro dele. Se for um caminho inexistente, a origem é renomeada para esse caminho.
Referência Completa de Opções
| Opção | Forma Longa | Comportamento |
|---|---|---|
-i | --interactive | Solicita confirmação antes de sobrescrever um ficheiro existente |
-f | --force | Suprime todas as solicitações; sobrescreve sem confirmação |
-n | --no-clobber | Nunca sobrescreve um ficheiro existente; ignora silenciosamente |
-u | --update | Move apenas quando a origem é mais recente que o destino ou o destino está ausente |
-v | --verbose | Imprime o nome de cada ficheiro à medida que é processado |
-b | --backup | Cria uma cópia de segurança de cada ficheiro que seria sobrescrito |
--suffix=SUFFIX | --suffix | Define o sufixo de cópia de segurança (o padrão é ~) |
--strip-trailing-slashes | — | Remove barras finais dos argumentos de origem |
-t DIR | --target-directory | Move todas as origens para o diretório especificado |
-T | --no-target-directory | Trata o destino como um ficheiro normal, não como um diretório |
Nota: O sinalizador -r / -R listado em muitos tutoriais não existe no GNU mv. Ao contrário de cp, o comando mv move diretórios recursivamente por padrão porque opera em entradas de diretório, não em conteúdos de ficheiros. Passar -r ao mv na maioria das distribuições Linux produzirá um erro ou será silenciosamente ignorado dependendo da implementação.
Operações Básicas com Exemplos Precisos
Mover um Ficheiro para um Diretório Diferente
mv /home/user/report.txt /var/backups/O ficheiro report.txt é relocado para /var/backups/. Se /var/backups/ estiver no mesmo sistema de ficheiros que /home/user/, isto é instantâneo. Caso contrário, os dados são fisicamente copiados.
Renomear um Ficheiro no Mesmo Local
mv old_config.conf new_config.confAmbos os caminhos partilham o mesmo diretório pai, pelo que esta é uma chamada rename(2) pura — sem movimento de dados, sem I/O.
Mover Múltiplos Ficheiros para um Diretório
mv file1.txt file2.txt file3.txt /var/www/html/assets/Quando são especificadas múltiplas origens, o destino deve ser um diretório existente. Se não existir, mv retornará um erro.
Mover um Diretório
mv /home/user/project /opt/projects/Toda a árvore de diretórios — incluindo todos os ficheiros e subdiretórios aninhados — é movida como uma única operação atómica no mesmo sistema de ficheiros. Nenhum sinalizador -r é necessário ou aceite.
Padrões de Utilização Avançada
Usar --backup para Prevenir Perda Acidental de Dados
A opção --backup é um dos mecanismos de segurança mais subutilizados em mv. Cria uma cópia de segurança versionada de qualquer ficheiro que seria sobrescrito:
mv --backup=numbered config.yml /etc/app/config.ymlIsto produz /etc/app/config.yml.~1~, .~2~, e assim sucessivamente para sobrescritas sucessivas. Em scripts de implementação automatizados, este padrão fornece um mecanismo de reversão leve sem uma ferramenta de cópia de segurança dedicada.
Modos de controlo de cópia de segurança:
none/off— Sem cópia de segurança (comportamento padrão sem--backup)simple/never— Cria sempre uma cópia de segurança simples com o sufixo~numbered/t— Cria cópias de segurança numeradas (.~1~,.~2~, …)existing/nil— Usa cópias de segurança numeradas se já existirem; caso contrário simples
Movimentos Condicionais com --update
mv --update /tmp/processed/*.csv /data/archive/Apenas os ficheiros em /tmp/processed/ que são mais recentes do que os seus homólogos em /data/archive/ serão movidos. Ficheiros com timestamps idênticos ou mais antigos são deixados intactos. Isto é particularmente útil em pipelines ETL e scripts de rotação de logs onde a idempotência é importante.
Usar -t para Sintaxe Compatível com Scripts
A opção --target-directory inverte a ordem dos argumentos, tornando-a compatível com pipelines xargs e find:
find /var/log -name "*.log.gz" -mtime +30 | xargs mv -t /mnt/cold-storage/logs/Sem -t, xargs precisaria de construir a lista de argumentos de forma diferente. Este padrão é muito mais fiável na automação de produção.
Combinar --no-clobber com Saída Detalhada
mv -nv *.conf /etc/app/conf.d/Isto move todos os ficheiros .conf sem sobrescrever nenhum existente, e imprime cada movimento bem-sucedido para stdout. A combinação é ideal para operações em massa seguras e auditáveis.
Mover Ficheiros Entre Sistemas de Ficheiros com Segurança
Ao mover ficheiros grandes ou diretórios entre pontos de montagem, considere este padrão para garantir a integridade:
rsync -a --remove-source-files /source/path/ /destination/path/ &&
find /source/path -type d -empty -deletersync com --remove-source-files realiza uma cópia verificada com validação de checksum seguida de eliminação, o que mv não fornece para operações entre sistemas de ficheiros. Use esta abordagem para migrações de dados críticos em servidores de produção.
Casos de Uso Práticos de Administração de Sistemas
Rotação de Logs de Aplicações
mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%Y%m%d)
kill -USR1 $(cat /var/run/nginx.pid)Isto renomeia o ficheiro de log ativo e sinaliza ao Nginx para reabrir o seu descritor de ficheiro de log. A combinação é a base da rotação manual de logs antes de logrotate a tratar automaticamente.
Implementar Ficheiros de Configuração Atomicamente
mv --backup=numbered /tmp/nginx.conf /etc/nginx/nginx.conf
nginx -t && systemctl reload nginxA cópia de segurança garante que a configuração anterior é preservada caso a nova falhe na validação.
Organizar Recursos do Servidor Web
Num servidor que executa uma aplicação web, organizar em massa ficheiros carregados por tipo:
mv /var/www/uploads/*.jpg /var/www/uploads/images/
mv /var/www/uploads/*.pdf /var/www/uploads/documents/
mv /var/www/uploads/*.mp4 /var/www/uploads/video/Este tipo de gestão estruturada de recursos é comum em servidores que alojam sites via Alojamento Web Partilhado ou ambientes VPS com cPanel geridos.
Preparar Renovações de Certificados SSL
Ao gerir certificados renovados manualmente, mv com cópia de segurança é um padrão de implementação seguro:
mv --backup=simple /etc/ssl/certs/domain.crt /etc/ssl/certs/domain.crt.bak
mv /tmp/new_domain.crt /etc/ssl/certs/domain.crtPara gestão automatizada de certificados, combinar isto com um serviço de Certificados SSL devidamente configurado elimina completamente a necessidade de rotação manual.
Arquivar Dados de Email num Servidor de Correio
Num servidor que executa serviços de correio, mover caixas de correio processadas para armazenamento a frio:
mv --update /var/mail/processed/ /mnt/archive/mail/$(date +%Y-%m)/Isto é diretamente aplicável a ambientes que utilizam infraestrutura dedicada de Alojamento de Email onde a gestão de caixas de correio é realizada ao nível do sistema de ficheiros.
mv vs. cp + rm vs. rsync: Quando Usar Cada Um
| Cenário | Melhor Ferramenta | Razão |
|---|---|---|
| Renomear ou mover no mesmo sistema de ficheiros | mv | Syscall rename(2) atómica; zero I/O |
| Mover entre sistemas de ficheiros, ficheiros pequenos | mv | Aceitável; copiar-e-eliminar é automático |
| Mover entre sistemas de ficheiros, dados grandes ou críticos | rsync --remove-source-files | Verificação de checksum; retomável |
| Mover com deduplicação ou controlo de largura de banda | rsync | Suporta --bwlimit, --checksum, transferência delta |
| Mover e manter a origem intacta | cp e depois verificar | Controlo explícito sobre ambas as cópias |
| Mover com transformação (compressão, etc.) | Script personalizado | mv não transforma dados |
| Mover em massa com filtragem | find + mv -t | Controlo preciso sobre critérios de seleção |
Erros Comuns e Como Evitá-los
Ambiguidade de barra final com diretórios:
mv directory_a/ directory_bSe directory_b existir, directory_a é colocado *dentro* de directory_b, resultando em directory_b/directory_a/. Se directory_b não existir, directory_a é renomeado para directory_b. Este comportamento surpreende muitos administradores. Use mv -T para forçar o destino a ser tratado como um caminho de ficheiro, não como um diretório contentor.
Expansão de wildcard sem correspondências:
mv *.log /archive/Se não existirem ficheiros .log, o shell expande *.log para a string literal *.log, e mv tenta mover um ficheiro literalmente chamado *.log, o que falha com um erro confuso. Use nullglob em scripts bash:
shopt -s nullglob
files=(*.log)
[[ ${#files[@]} -gt 0 ]] && mv "${files[@]}" /archive/Condições de corrida em ambientes concorrentes:
Múltiplos processos a mover ficheiros de um diretório de spool partilhado podem causar conflitos. Use mv com um nome temporário único e depois renomeie atomicamente:
mv /spool/job_123.tmp /spool/processing/job_123.workComo rename(2) é atómico, este padrão é seguro para filas de trabalho num único sistema de ficheiros.
Mover ficheiros com nomes que começam com um traço:
mv -- -oddfile.txt /destination/O -- sinaliza o fim das opções, impedindo que -oddfile.txt seja interpretado como um sinalizador.
Permissões após movimentos entre sistemas de ficheiros:
mv não preserva atributos estendidos (xattrs), ACLs ou contextos SELinux em todos os tipos de sistemas de ficheiros. Após um movimento entre sistemas de ficheiros, verifique com:
ls -lZ /destination/file
getfattr -d /destination/fileUsar mv de Forma Fiável em Produção com Scripts
Para qualquer script que use mv num contexto de produção, aplique estas práticas incondicionalmente:
#!/usr/bin/env bash
set -euo pipefail
SOURCE="/var/data/export"
DEST="/mnt/nas/backup/$(date +%Y%m%d)"
# Verify source exists
[[ -e "$SOURCE" ]] || { echo "Source not found: $SOURCE" >&2; exit 1; }
# Verify destination is writable
mkdir -p "$DEST"
[[ -w "$DEST" ]] || { echo "Destination not writable: $DEST" >&2; exit 1; }
# Perform move with verbose output for logging
mv -v "$SOURCE" "$DEST/"set -euo pipefailgarante que o script termina em qualquer erro, variável indefinida ou pipe falhado.- Verificações explícitas de existência e capacidade de escrita previnem falhas silenciosas.
- A saída detalhada cria um registo de auditoria nos logs do sistema.
Matriz de Decisão: Escolher as Opções Certas de mv
| Situação | Sinalizadores Recomendados |
|---|---|
| Interativo, ficheiro único, estado de destino desconhecido | -i -v |
| Script automatizado, o destino não deve ser sobrescrito | -n |
| Script automatizado, sempre sobrescrever | -f |
| Implementação com capacidade de reversão | --backup=numbered |
| Movimento estilo sincronização, apenas ficheiros mais recentes | -u |
Movimento em massa via find ou xargs | -t /destination/ |
| Depurar um script | -v |
| Ficheiros com nomes especiais (traços, espaços) | -- antes da origem |
Principais Conclusões Técnicas
mvno mesmo sistema de ficheiros é atómico e produz zero I/O de disco — é uma operação apenas de metadados viarename(2).mventre sistemas de ficheiros é uma sequência sequencial de copiar-e-eliminar; trate-o comocppara planeamento de fiabilidade.- Não existe sinalizador
-rno GNUmv— os diretórios são movidos recursivamente por padrão. --backup=numberedé a funcionalidade de segurança de produção mais subutilizada emmv.--no-clobber(-n) e--force(-f) são mutuamente exclusivos; o último especificado prevalece.- Para migrações críticas de dados entre sistemas de ficheiros,
rsync --remove-source-filesfornece verificação de checksum quemvnão consegue. - Cite sempre variáveis em scripts e use
--para lidar com nomes de ficheiros com caracteres especiais. - Verifique contextos SELinux e ACLs após qualquer movimento entre sistemas de ficheiros em ambientes com segurança reforçada.
Perguntas Frequentes
O mv funciona de forma diferente em SSDs em comparação com HDDs?
Para movimentos no mesmo sistema de ficheiros, não — a operação é uma atualização de metadados independentemente do hardware de armazenamento. Para movimentos entre sistemas de ficheiros, os SSDs reduzem o tempo real da fase de cópia, mas o comportamento lógico e os riscos são idênticos.
Por que razão mv demora às vezes muito tempo mesmo para um ficheiro pequeno?
Se a origem e o destino estiverem em sistemas de ficheiros diferentes — incluindo montagens NFS, tmpfs ou partições separadas — mv realiza uma cópia completa. Mesmo um ficheiro pequeno movido através de uma montagem de rede lenta será lento. Verifique com df -h source destination para confirmar se partilham um sistema de ficheiros.
O mv pode ser usado para mover ficheiros entre contentores Docker ou volumes?
Não diretamente. Os volumes Docker são namespaces de sistema de ficheiros separados. mv dentro de um único volume funciona normalmente, mas mover dados entre volumes requer operações do tipo cp, tipicamente via docker cp ou uma bind mount partilhada.
O que acontece se mv for interrompido a meio de uma operação num movimento entre sistemas de ficheiros?
O ficheiro de origem permanece intacto até que a cópia seja concluída e a desvinculação seja bem-sucedida. Se o processo for terminado após a cópia mas antes da desvinculação, ambas as cópias existem. Se for terminado durante a cópia, o ficheiro de destino parcial permanece e a origem fica intacta. Verifique sempre ambos os caminhos após um mv entre sistemas de ficheiros interrompido.
O mv é seguro para usar em tarefas cron sem sinalizadores interativos?
Sim, desde que use -f ou -n explicitamente para suprimir quaisquer solicitações (que fariam a tarefa cron ficar suspensa), valide os caminhos antes de executar, e redirecione tanto stdout como stderr para um ficheiro de log para auditabilidade.
