Como eu salvo arquivos alterados?

8

Eu tenho duas pastas:

  • ORIGINAL /
  • ORIGINAL_AND_MY_CHANGES /

Meu amigo tem uma cópia do ORIGINAL /. Eu gostaria de gerar MY_CHANGES.tgz - ele deve conter apenas arquivos novos / alterados de ORIGINAL_AND_MY_CHANGES / comparando com ORIGINAL /. Então meu amigo pode descompactá-lo em sua cópia do ORIGINAL / e obter ORIGINAL_AND_MY_CHANGES /. Como posso fazer isso?

P.S. Eu tentei diff , mas ele não pode salvar dados binários e rsync --link-dest - ele gera hard links que são inúteis no arquivo.

P.P.S. No meu caso, o tempo de modificação não pode ser usado para decidir qual arquivo foi alterado.

    
por Dmitry 23.11.2011 / 15:44

2 respostas

7

Com rsync

O que você está fazendo é essencialmente um backup incremental: seu amigo (seu backup) já tem os arquivos originais e você deseja criar um arquivo contendo os arquivos que você alterou daquele original.

O

Rsync possui recursos para backups incrementais.

cd ORIGINAL_AND_MY_CHANGED
rsync -a -c --compare-dest=../ORIGINAL . ../CHANGES_ONLY
  • -a significa preservar todos os atributos (tempos, propriedade, etc.).
  • -c significa comparar o conteúdo do arquivo e não confiar na data e no tamanho.
  • --compare-dest=/some/directory significa que os arquivos que são idênticos nesse diretório e a árvore de origem não são copiados. Observe que o caminho é relativo ao diretório de destino.

O Rsync copia todos os diretórios, mesmo se nenhum arquivo for parar lá. Para se livrar desses diretórios vazios, execute find -depth CHANGES_ONLY -type d -empty -delete (ou se o seu find não tiver -delete e -empty , execute find -depth CHANGES_ONLY -exec rmdir {} + 2>/dev/null ).

Em seguida, faça o arquivamento no diretório CHANGES_ONLY .

O caminho pedestre

Atravesse o diretório com o seu arquivo. Ignore os arquivos idênticos ao original. Crie diretórios no destino, conforme necessário. Copie arquivos alterados.

cd ORIGINAL_AND_MY_CHANGES
find . \! -type d -exec sh -c '
  for x; do
    if cmp -s "$x" "../ORIGINAL/$x"; then continue; fi
    [ -d "../CHANGES_ONLY/$x" ] || mkdir -p "../CHANGES_ONLY/${%/*}"
    cp -p "$x" "../CHANGES_ONLY/$x"
  done
' {} +
    
por 23.11.2011 / 22:22
5

O comando

rsync --only-write-batch=FILE $other_options ORIGINAL_AND_MY_CHANGES/ ORIGINAL/

produziria um arquivo FILE contendo as alterações necessárias (sem modificar nada).

O patch pode ser aplicado em outro site, onde você pega o arquivo FILE, com

rsync --read-batch=FILE ORIGINAL/
    
por 23.11.2011 / 16:16