Você pode usar rsync
para fazer isso:
$ rsync -abviuzP src/ dest/
-
-a
modo de arquivamento; é igual a -rlptgoD (não -H, -A, -X) -
-i
ativa o formato discriminado, que mostra mais informações do que o formato padrão -
-b
cria arquivos de backup rsync que existem nas duas pastas, anexando ~ ao arquivo antigo. Você pode controlar este sufixo com --suffix .suf -
-u
faz a transferência rsync pular arquivos que são mais recentes no dest do que no src -
-z
ativa a compactação, o que é útil ao transferir arquivos facilmente compactáveis em links lentos -
-P
ativa --partial e --progress-
--partial
faz o rsync manter arquivos parcialmente transferidos se a transferência for interrompida -
--progress
mostra uma barra de progresso para cada transferência, útil se você transferir arquivos grandes
-
Eu abandonaria vários desses switches, mas isso é só para você começar. Eu provavelmente usaria algo assim:
$ rsync -abuP src/ dest/
Uma vez que parece OK, você pode executar este comando para remover os arquivos de backup:
$ find dest/ -name "*.~" -delete
Exemplo
Vamos fingir que temos os seguintes dados de amostra.
dados originais
Usaremos os seguintes comandos para fabricar alguns dados falsos.
$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done
Os dados falsificados são os seguintes:
$ tree -DsifvF --noreport dest/
dest
[ 4096 Aug 29 22:21] dest/dir1/
[ 2 Aug 29 22:21] dest/dir1/file1
[ 4096 Aug 29 22:21] dest/dir2/
[ 2 Aug 29 22:21] dest/dir2/file2
[ 4096 Aug 29 22:21] dest/dir3/
[ 2 Aug 29 22:21] dest/dir3/file3
[ 4096 Aug 29 22:21] dest/dir4/
[ 2 Aug 29 22:21] dest/dir4/file4
[ 4096 Aug 29 22:21] dest/dir5/
[ 2 Aug 29 22:21] dest/dir5/file5
novos dados
Agora replicaremos os dados originais ( dest/*
- > src/
) e adicionaremos alguns arquivos novos ao mix. Isso simula uma "nova versão.
$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done
Os dados falsificados são os seguintes:
$ tree -DsifvF --noreport src/
src
[ 4096 Aug 29 22:21] src/dir1/
[ 3 Aug 29 23:00] src/dir1/file1
[ 4096 Aug 29 22:21] src/dir2/
[ 2 Aug 29 22:21] src/dir2/file2
[ 4096 Aug 29 22:21] src/dir3/
[ 3 Aug 29 23:00] src/dir3/file3
[ 4096 Aug 29 22:21] src/dir4/
[ 2 Aug 29 22:21] src/dir4/file4
[ 4096 Aug 29 22:21] src/dir5/
[ 3 Aug 29 23:00] src/dir5/file5
[ 4096 Aug 29 23:00] src/dir11/
[ 5 Aug 29 23:00] src/dir11/file11
mescla src / into dest /
Isso simula que apenas configuramos nossa nova árvore de software em src/
e queremos mesclar em nosso diretório pré-existente, dest/
.
$ rsync -abuP src/ dest/
sending incremental file list
dir1/file1
3 100% 0.00kB/s 0:00:00 (xfer#1, to-check=5/13)
dir11/
dir11/file11
5 100% 4.88kB/s 0:00:00 (xfer#2, to-check=4/13)
dir3/file3
3 100% 2.93kB/s 0:00:00 (xfer#3, to-check=2/13)
dir5/file5
3 100% 2.93kB/s 0:00:00 (xfer#4, to-check=0/13)
sent 416 bytes received 97 bytes 1026.00 bytes/sec
total size is 18 speedup is 0.04
Como você pode ver, os arquivos a seguir foram atualizados, file1, file3, file5, e o novo arquivo11 adicionado recentemente.
Como confirmação, podemos ver que os seguintes arquivos de backup foram criados por rsync
quando encontrou os arquivos preexistentes em dest/
.
$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~