A melhor maneira de sincronizar arquivos - copie somente os arquivos EXISTENTES e somente se for mais recente que o destino

18

Estou fazendo esta sincronização localmente no Ubuntu 12.04. Os arquivos são geralmente pequenos arquivos de texto (código).

Eu quero copiar (preservando o mtime stamp) do diretório source para target , mas só quero copiar se o arquivo em target já existir e for mais antigo do que o em source .

Por isso, estou copiando somente arquivos mais recentes em source , mas eles devem existir em target ou não serão copiados. ( source terá muito mais arquivos que target .)

Na verdade, vou copiar de source para vários diretórios target . Eu menciono isso caso isso afete a escolha da solução. No entanto, posso executar facilmente o meu comando várias vezes, especificando o novo target de cada vez, se for necessário.

    
por MountainX 27.02.2014 / 06:45

1 resposta

25

Eu acredito que você pode usar rsync para fazer isso. A principal observação seria a necessidade de usar as opções --existing e --update .

        --existing              skip creating new files on receiver
        -u, --update            skip files that are newer on the receiver

Um comando como esse faria isso:

$ rsync -avz --update --existing src/ dst

Exemplo

Digamos que tenhamos os seguintes dados de amostra.

$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2

Qual é o seguinte:

$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

Agora, se eu sincronizar esses diretórios, nada acontecerá:

$ rsync -avz --update --existing src/ dst
sending incremental file list

sent 12 bytes  received 31 bytes  406.00 bytes/sec
total size is 0  speedup is 0.00

Se nós touch um arquivo de origem for mais recente:

$ touch src/file3 
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3

Outra execução do comando rsync :

$ rsync -avz --update --existing src/ dst
sending incremental file list
file3

sent 115 bytes  received 31 bytes  292.00 bytes/sec
total size is 0  speedup is 0.00

Podemos ver que file3 , como é mais recente, e que existe em dst/ , é enviado.

Teste

Para garantir que as coisas funcionem antes de você soltar o comando, sugiro usar outro dos switches rsync , --dry-run . Vamos adicionar outro -v também, então a saída de rsync é mais detalhada.

$ rsync -avvz --dry-run --update --existing src/ dst 
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 88 bytes  received 21 bytes  218.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
    
por 27.02.2014 / 07:08