Para mover arquivos com nomes duplicados e manter ambas as cópias, atribua a cada arquivo recebido um nome ainda não usado no destino antes de movê-lo. Este guia cria um atalho para Mac que adiciona sufixos numerados, usando arquivos de texto descartáveis para demonstrar o resultado.

A tarefa consiste em mover arquivos comuns de uma pasta local para outra que talvez já contenha arquivos com os mesmos nomes. Os arquivos existentes no destino permanecem no lugar; os arquivos recebidos ganham nomes como notes (2).txt. Manter ambos significa conservar os dois arquivos no destino após a movimentação — o arquivo recebido deixa de permanecer na pasta de origem.

O que a Apple documenta sobre manter ambos os arquivos?

A Apple documenta o suporte à execução de scripts de shell diretamente nos Atalhos. As páginas públicas dos Atalhos citadas aqui não especificam uma política de conflito Manter Ambos para a ação Mover Arquivo. Em vez de depender de um ajuste não documentado, este fluxo define explicitamente a escolha do nome em Executar Script de Shell. A Apple descreve esse recurso de script em Conheça os Atalhos para macOS.

O comando subjacente do macOS tem um comportamento documentado mais restrito: mv -n não substitui um arquivo existente. Ele não gera um nome novo. Por isso, este atalho precisa tanto de um loop para escolher o nome quanto da opção que impede a substituição. São responsabilidades distintas, conforme mostrado no código-fonte do manual de mv(1), publicado pela Apple.

A mesclagem de pastas no Finder também tem limitações. A Apple informa que a opção Mesclar só aparece quando uma pasta contém itens ausentes na outra; quando as pastas contêm versões diferentes de arquivos com nomes idênticos, as opções são Parar ou Substituir. Portanto, a mesclagem de pastas não oferece o comportamento de numeração de arquivos necessário aqui. Consulte Organizar arquivos em pastas no Mac.

Prepare um exemplo descartável com nomes duplicados

Use este exemplo com duas pastas no mesmo disco local. Ele processa diretamente arquivos comuns, não ocultos, dentro da pasta de origem. Não processa subpastas recursivamente, não move aliases nem links simbólicos e não mescla pacotes. Execute uma instância por vez, sem que outro processo altere nenhuma das pastas.

O atalho requer que Executar Script de Shell esteja disponível e possa ser executado no Mac. Se essa ação não puder ser executada na sua configuração, use o procedimento do Finder mais adiante neste artigo. Os exemplos abaixo não exigem software adicional.

Abra o Terminal e cole este comando completo de configuração. Ele cria uma nova pasta na Mesa contendo apenas texto sintético. Se Shortcuts-name-demo já existir, o comando será interrompido em vez de reutilizar o conteúdo dela.

/bin/bash <<'BASH'
set -e
root="$HOME/Desktop/Shortcuts-name-demo"
/bin/mkdir "$root"
/bin/mkdir "$root/Incoming" "$root/Collected"
printf '%s\n' 'Incoming synthetic notes.' > "$root/Incoming/notes.txt"
printf '%s\n' 'Existing synthetic notes.' > "$root/Collected/notes.txt"
printf '%s\n' 'Earlier synthetic second copy.' > "$root/Collected/notes (2).txt"
printf '%s\n' 'Synthetic readme.' > "$root/Incoming/readme.txt"
printf 'Example folder: %s\n' "$root"
BASH

O conflito é intencional: o destino já contém notes.txt e notes (2).txt. Um atalho que simplesmente acrescentasse (2) encontraria outro conflito. A regra útil é testar candidatos sucessivos até encontrar um nome disponível.

Para facilitar a inspeção, ative Mostrar todas as extensões de nome de arquivo em Finder > Ajustes > Avançado. A Apple explica que ocultar uma extensão altera sua exibição, enquanto alterar a própria extensão pode afetar qual app abre o arquivo. Mantenha .txt intacto neste exemplo. Consulte Mostrar ou ocultar extensões de nome de arquivo no Mac.

Crie o atalho com tratamento explícito de conflitos

Crie um atalho usando o botão de adicionar nos Atalhos e dê a ele o nome Mover Arquivos e Manter Ambos. Encontre Executar Script de Shell na biblioteca de ações e adicione-o. A Apple documenta como criar atalhos e adicionar ações em Criar um atalho personalizado no Mac.

Defina o shell da ação como /bin/bash e substitua o script de exemplo pelo programa completo abaixo. Esta versão lê os caminhos das duas pastas de variáveis no script. Ela não consome a entrada do atalho, itens selecionados no Finder nem a entrada padrão; portanto, a configuração de passagem de entrada não tem efeito.

set -e
shopt -s nullglob

src_dir="$HOME/Desktop/Shortcuts-name-demo/Incoming"
dst_dir="$HOME/Desktop/Shortcuts-name-demo/Collected"

fail() {
    printf '%s\n' "$1" >&2
    exit 1
}

[[ -d "$src_dir" ]] || fail "Source folder does not exist."
[[ -d "$dst_dir" ]] || fail "Destination folder does not exist."

src_dir=$(cd "$src_dir" && pwd -P)
dst_dir=$(cd "$dst_dir" && pwd -P)
[[ "$src_dir" != "$dst_dir" ]] || fail "Choose different folders."

moved=0
for src in "$src_dir"/*; do
    if [[ -L "$src" || ! -f "$src" ]]; then
        printf 'Skipped non-regular item: %s\n' "$src" >&2
        continue
    fi

    name=${src##*/}
    stem=$name
    ext=
    if [[ "$name" == *.* && "$name" != .* && "$name" != *. ]]; then
        stem=${name%.*}
        ext=.${name##*.}
    fi

    target="$dst_dir/$name"
    number=2
    while [[ -e "$target" || -L "$target" ]]; do
        target="$dst_dir/$stem ($number)$ext"
        number=$((number + 1))
    done

    /bin/mv -n "$src" "$target" || fail "Move failed: $src"
    if [[ -e "$src" || -L "$src" || ! -f "$target" ]]; then
        fail "Move was not completed as expected: $src"
    fi

    moved=$((moved + 1))
    printf 'Moved: %s -> %s\n' "$name" "${target##*/}"
done
printf 'Completed: %s file(s) moved.\n' "$moved"

Adicione Visualização Rápida depois da ação de script para inspecionar o relatório. A Apple recomenda especificamente inserir Visualização Rápida durante os testes para ver qual conteúdo passa entre as ações. Consulte Testar ações nos Atalhos no Mac.

O relatório contém texto que descreve as movimentações concluídas. Ele não é uma lista de objetos File movidos. Se você ampliar o atalho mais tarde, não trate essas linhas do relatório como entrada de arquivos. A Apple documenta que as ações aceitam e produzem tipos específicos de conteúdo; use Mostrar Informações em uma ação para inspecionar a entrada aceita e a saída resultante. Consulte Conexões entre ações nos Atalhos no Mac.

Como a regra de nomenclatura preserva ambas as cópias?

Para cada arquivo de origem, o script primeiro verifica o caminho original no destino. Se esse caminho estiver ocupado, tenta (2), depois (3) e continua até encontrar um candidato não usado. Diretórios existentes e links simbólicos também são considerados nomes ocupados. A movimentação final usa mv -n como verificação adicional para impedir a substituição, seguindo a documentação da Apple sobre mv(1).

Arquivo recebido O destino já contém Nome escolhido para o destino
notes.txt Nada com esse nome notes.txt
notes.txt notes.txt notes (2).txt
notes.txt notes.txt, notes (2).txt notes (3).txt
readme readme readme (2)
archive.tar.gz archive.tar.gz archive.tar (2).gz

Estas são as regras de nomenclatura do programa, não uma afirmação sobre a nomenclatura automática do Finder. Apenas a extensão final é separada: .gz permanece no final de archive.tar (2).gz. Um arquivo recebido que já se chame notes (2).txt mantém esse nome-base, gerando notes (2) (2).txt se necessário. O script não interpreta um número existente como uma versão.

O programa coloca os caminhos entre aspas e percorre os nomes de arquivo expandidos pelo shell, em vez de dividir uma listagem de texto. Assim, nomes com espaços permanecem como itens únicos. A sintaxe usa Bash de propósito; mantenha /bin/bash selecionado. As Noções básicas de scripts de shell da Apple explicam por que as diferenças entre dialetos de shell são importantes.

Execute o exemplo e verifique o resultado

Execute o atalho uma vez e inspecione as duas pastas no Finder. Para os dados sintéticos fornecidos, o conteúdo esperado no destino é:

  • notes.txt, ainda contendo Existing synthetic notes.
  • notes (2).txt, ainda contendo Earlier synthetic second copy.
  • notes (3).txt, contendo Incoming synthetic notes.
  • readme.txt, contendo Synthetic readme.

A pasta Incoming agora deve estar vazia, e o relatório deve terminar com Completed: 2 file(s) moved. Se você executar o atalho novamente sem adicionar arquivos, ele deve informar zero movimentações. Estes são os resultados esperados para o exemplo; o fluxo completo dos Atalhos do macOS não foi executado durante a preparação deste artigo. As expressões de divisão de nomes de arquivo foram verificadas separadamente com nomes sintéticos.

Se o atalho parar, inspecione as duas pastas antes de executá-lo novamente. Cada arquivo é movido individualmente, portanto, um erro em um arquivo posterior não reverte as movimentações anteriores. O script verifica se o arquivo permanece na origem após cada comando, em vez de presumir que a conclusão de cada comando significa que um arquivo foi movido.

Para uma falha comum de movimentação, a Apple recomenda verificar se o arquivo está aberto e se há espaço disponível suficiente no destino. Consulte Se você não consegue mover ou copiar um item no Mac. Um nome de arquivo que fique longo demais após a adição de um sufixo também pode impedir que o programa conclua essa movimentação; ele para em vez de truncar o nome.

A verificação de existência e a movimentação são operações separadas. Este programa foi pensado para um fluxo local, executado manualmente por uma pessoa, com pastas estáveis. Ele não reserva nomes candidatos contra alterações simultâneas. Evite execuções simultâneas e outros processos que gravem nas pastas do exemplo.

Use o Finder quando houver poucos conflitos

Para um lote pequeno, renomeie explicitamente o arquivo recebido antes de movê-lo. No exemplo sintético, inspecione Collected, selecione Incoming/notes.txt, pressione Return, digite notes (3).txt e pressione Return novamente. A Apple documenta esse procedimento para renomear em Renomear arquivos, pastas e discos no Mac.

Em seguida, arraste o arquivo renomeado para Collected no mesmo disco. A Apple documenta que arrastar um item para uma pasta o move, que manter Option pressionada faz uma cópia e que manter Command pressionada ao arrastar para um disco diferente move o item. Consulte Organizar arquivos em pastas no Mac. Se surgir outro conflito de nomes, cancele a transferência e escolha outro nome disponível.

Quando o exemplo descartável funcionar como esperado no seu Mac, adapte apenas src_dir e dst_dir para outro par de pastas locais nas mesmas condições. Mantenha juntos o loop de nomes numerados e as verificações de conclusão: escolher um nome disponível preserva ambas as cópias no destino, e verificar o resultado informa se o arquivo recebido realmente foi movido.

Fontes