Meilleure façon de synchroniser les files – copyr uniquement les files EXISTANTS et seulement si plus récent que la cible

Je fais cette synchronisation localement sur Ubuntu 12.04. Les files sont généralement de petits files text (code).

Je veux copyr (préservant le cachet mtime) du directory source vers la target mais je veux seulement copyr si le file dans la target existe déjà et est plus ancien que celui dans la source .

Donc, je ne fais que copyr des files qui sont plus récents dans la source , mais ils doivent exister dans la target ou ils ne seront pas copiés. (la source aura beaucoup plus de files que la target .)

Je vais effectivement copyr à partir de la source vers plusieurs directorys target . Je le mentionne au cas où cela affecterait le choix de la solution. Cependant, je peux facilement exécuter ma command plusieurs fois, en spécifiant la nouvelle target chaque fois, si c'est ce qui est requirejs.

Je crois que vous pouvez utiliser rsync pour le faire. La principale observation serait de devoir utiliser les --existing et --update .

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

Une command comme celle-ci le ferait:

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

Exemple

Disons que nous avons datatables d'exemple suivantes.

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

Qui ressemble à ceci:

 $ 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 

Maintenant, si je synchronisais ces directorys, rien ne se passerait:

 $ 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 

Si nous touch un file source pour qu'il soit plus récent:

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

Une autre exécution de la command 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 

Nous pouvons voir que file3 , puisqu'il est plus récent, et qu'il existe dans dst/ , il est envoyé.

Essai

Pour vous assurer que les choses fonctionnent avant de couper la command, je suggère d'utiliser un autre des commutateurs de rsync , --dry-run . Ajoutons un autre -v aussi la sortie de rsync est plus verbeuse.

 $ 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)