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.
ORsync 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
' {} +