Gerenciando colisões de nomes de arquivos ao mesclar pastas (linux)

0

Eu preciso de um tipo de sincronização para executar a fusão bidirecional (recursiva) de pastas.

Digamos que eu tenha 2 pastas A e B.

Pasta A contém arquivos: 1, 3, 5 and 7.
A pasta B contém arquivos: 1, 2, 3 and 6.

Após a execução da mesclagem, o resultado deve ser o seguinte:

Pasta A: 1, 1-b, 2, 3, 3-b, 5, 6, 7
Pasta B: 1, 1-a, 2, 3, 3-a, 5, 6, 7

Quebrando-os separadamente:

as pastas A e B contendo: 2, 5, 6, 7
(a união OR de nomes de arquivos não colidindo: uma cópia bidirecional (de mesma classificação, nenhuma origem específica e nenhum destino específico) sem renomear;

Pasta A contendo também: 1, 1-b, 3, 3-b (versões próprias e adicionadas)
Pasta B contendo também: 1, 1-a, 3, 3-a (versões próprias e adicionadas)
(O dash-a ou dash-b é apenas um espaço reservado para renomeação automática para contornar a colisão de nomes, não é realmente importante. Todo sufixo serve). Basicamente, cada pasta conteria todas as versões (sem as mais recentes, sobrescrevendo as antigas) de todos os arquivos, independentemente de seus nomes.

Como eu poderia obter esse resultado? Eu olhei para 'meld', mas não funcionou como esperado (ele propôs a sobrescrita de arquivos existentes, incapaz de renomear), e 'rsync' parece intrinsecamente assimétrico (conferindo maior classificação à fonte do que ao destino). Eu preciso de fusão verdadeiramente paritética ...

Agradecemos antecipadamente por qualquer ajuda. BTW ... um SW existente dedicado seria mais apreciado do que reinventar a água quente à mão. Mas, se não existe, também o script faria. TY. Gatto

    
por GattoVizzato 21.08.2017 / 03:03

1 resposta

0

Procure nas info páginas do antigo cp . Um comando como

cp --archive --backup --suffix="-original" A/* B

Deve copiar todos os arquivos de A para B, e se houver arquivos já existentes (nomes de arquivos conflitantes), o arquivo de destino existente será renomeado para [name]-original (ou seja, um backup será feito primeiro).

Em seguida, executá-lo novamente usando --no-clobber em vez de --backup e --suffix deve copiar os arquivos restantes apenas em B para A

cp --archive --no-clobber --exclude='*-original' B/* A

Isso deve excluir os arquivos [name]-original em B. Certifique-se de que não haja arquivos com esse sufixo para começar.

Adicione um -v para ver o que está acontecendo.

[Tentativa - recursiva, mas não exatamente como esperada]

    
por 21.08.2017 / 04:31