Como migrar uma mudança na estrutura de diretórios?

1

Eu uso o rsync para atualizar o backup remoto de minhas fotos e vídeos digitais. Tenho cerca de 100 GB de dados.

Agora reorganizei minha pasta de mídia em uma estrutura mais lógica. Feito manualmente, não apenas usando algum script como exiftool . O problema é que, para o rsync, o diretório remoto parece completamente diferente. Se eu executar uma atualização, ela excluirá os arquivos que realmente existem (embora em outro local), após os quais fará o upload dos mesmos arquivos novamente.

Com a minha velocidade de upload lenta, vai demorar muito tempo.

Como todo nome de arquivo é único, suponho que será possível escrever um script para reorganizar a pasta remota de acordo com a pasta local.

Alguém conhece uma solução para esse problema?

    
por marlar 28.01.2013 / 13:29

1 resposta

1

Opção 1: volte no tempo e leia isto: link Isso usa um truque com hardlinks para otimizar a operação (observe cuidadosamente a omissão de "/" no exemplo, isso pode ser diferente do que você está acostumado). Se você tiver uma cópia de backup local antes da reorganização, talvez você possa restaurar e usar isso (a complicação é poder criar a cópia do hardlink conforme necessário).

Opção 2: se você não tiver espaços / citações em seus nomes de arquivos ou diretórios e não pretender manter nenhuma duplicação, poderá criar um script rápido e sujo de copiar / renomear como este.

Na fonte:

cd /wherever
find . -type f | xargs sha1sum | sort > /tmp/src.out

No destino

cd /wherever
find . -type f | xargs sha1sum | sort > /tmp/dst.out

Copie o arquivo dst.out para a fonte e, em seguida, na origem:

join -j 1 /tmp/src.out /tmp/dst.out | while read sum src dst; do
    if [ "$src" != "$dst" ]; then
        echo mkdir -p $(dirname "$src")
        echo cp -ipl "$dst" "$src"
    fi
done > fixup.sh

Isso gerará um conjunto de comandos mkdir/cp que você pode executar ( fixup.sh ) no diretório superior de sua cópia no destino. Certifique-se de que a saída do script faça o que você precisa para fazer . cp -ipl não será substituído sem aviso e copiará por link físico. Um rsync --delete ... subseqüente excluirá os arquivos antigos, supondo que deseja uma cópia idêntica. Use rsync --dry-run ... depois para confirmar a extensão das diferenças restantes.

(É possível usar " mv -i " em vez do não destrutivo " cp -ipl ", salvando a duplicação e a limpeza.)

Se você tem nomes de arquivos / diretórios problemáticos, você precisará fazer algum processamento intermediário de nomes de arquivos, ou tente uma das soluções aqui: link

Atualização: Se você puder tolerar a explosão em uma fábrica de pontuação que passa por uma linha de comando sed :

find . -type f -print0 | xargs -0 sha1sum | 
sed -re $'s/(^[0-9a-z]*)  /\1__/; 
    s/ /\\x20/g;  s/\'/\\\'/g; 
    s/(^[0-9a-z]*)__/\1  /; 
    s/  (.*)$/  $\'\1\'/g;'

Isso manipulará espaços e aspas simples / duplas (embora estejamos nos aproximando de perl territory para um trabalho pesado adequado). Ele usa a construção bash $'' para citar sequências problemáticas.

    
por 28.01.2013 / 18:57