15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
02.01.2024

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

Argumentos:

  • 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çãoForma LongaComportamento
-i--interactiveSolicita confirmação antes de sobrescrever um ficheiro existente
-f--forceSuprime todas as solicitações; sobrescreve sem confirmação
-n--no-clobberNunca sobrescreve um ficheiro existente; ignora silenciosamente
-u--updateMove apenas quando a origem é mais recente que o destino ou o destino está ausente
-v--verboseImprime o nome de cada ficheiro à medida que é processado
-b--backupCria uma cópia de segurança de cada ficheiro que seria sobrescrito
--suffix=SUFFIX--suffixDefine o sufixo de cópia de segurança (o padrão é ~)
--strip-trailing-slashesRemove barras finais dos argumentos de origem
-t DIR--target-directoryMove todas as origens para o diretório especificado
-T--no-target-directoryTrata 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.conf

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

Isto 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 -delete

rsync 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 nginx

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

Para 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árioMelhor FerramentaRazão
Renomear ou mover no mesmo sistema de ficheirosmvSyscall rename(2) atómica; zero I/O
Mover entre sistemas de ficheiros, ficheiros pequenosmvAceitável; copiar-e-eliminar é automático
Mover entre sistemas de ficheiros, dados grandes ou críticosrsync --remove-source-filesVerificação de checksum; retomável
Mover com deduplicação ou controlo de largura de bandarsyncSuporta --bwlimit, --checksum, transferência delta
Mover e manter a origem intactacp e depois verificarControlo explícito sobre ambas as cópias
Mover com transformação (compressão, etc.)Script personalizadomv não transforma dados
Mover em massa com filtragemfind + mv -tControlo preciso sobre critérios de seleção

Erros Comuns e Como Evitá-los

Ambiguidade de barra final com diretórios:

mv directory_a/ directory_b

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

Como 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/file

Usar 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 pipefail garante 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çãoSinalizadores 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

  • mv no mesmo sistema de ficheiros é atómico e produz zero I/O de disco — é uma operação apenas de metadados via rename(2).
  • mv entre sistemas de ficheiros é uma sequência sequencial de copiar-e-eliminar; trate-o como cp para planeamento de fiabilidade.
  • Não existe sinalizador -r no GNU mv — os diretórios são movidos recursivamente por padrão.
  • --backup=numbered é a funcionalidade de segurança de produção mais subutilizada em mv.
  • --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-files fornece verificação de checksum que mv nã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.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar