Je trouve plusieurs réponses à la question, je voulais donc demander aux personnes qui l'utilisent réellement, plutôt que de simplement créer le plus grand blog en remplissant des informations aléatoires semi-inutiles.
Scénario: moi
rsync -av --progress /dir/a /dir/b
et ça fait son truc.
J'ajoute de nouveaux fichiers à / dir / a et j'exécute à nouveau la même commande, il sait ce qu'il a fait et ne copie que les nouveaux fichiers.
J'ajoute de nouveaux fichiers dans / dir / a et je renomme certains fichiers dans / dir / b, et j'en supprime peut-être aussi quelques-uns.
Si je cours à rsync -av --progress /dir/a /dir/b
nouveau, qu'est-ce qui sera copié? Juste les nouveaux fichiers car il sait ce qu'ils ont déjà copié, ou les fichiers qui ont été renommés / supprimés aussi, car ils ne sont plus présents.
Et en prime, si les fichiers précédemment copiés sont à nouveau copiés, existe-t-il un moyen d'empêcher cela, de sorte que seuls les nouveaux ajouts à / dir / a soient copiés?
Pour le moment, je suis heureux de vérifier les choses manuellement, mais à mesure que les données augmentent, je vais avoir besoin de plus d'automatisation pour effectuer cette tâche.
-i
drapeau est très pratique. Pour chaque fichier, il donne une chaîne de correspondance qui peut être décodée pour voir pourquoi elle correspond (indicateur pour l'heure du mod, indicateur pour la taille, etc.)Réponses:
Non, il ne sait pas ce qu'il a fait lors d'une précédente exécution. Il compare les données côté réception avec les données à envoyer. Avec des données suffisamment petites, cela ne sera pas apparent, mais lorsque vous avez des répertoires suffisamment grands, le temps passé à comparer avant le début de la copie se fait facilement sentir.
La vérification par défaut concerne les heures et les tailles de modification des fichiers. De
man rsync
:Et:
Notez que ces options ne sont pas impliquées par les options que vous avez utilisées.
-a
est:la source
--fuzzy
une fois les reconnaîtra comme les mêmes dans le même répertoire. L'utilisation de--fuzzy
deux fois étend cette capacité à d'autres emplacements. Voirman rsync
pour plus de détails. Bien sûr, l'une des principales raisons de l'utilisationrsync
est sa capacité à copier uniquement les parties d'un fichier qui ont changé. Cela peut rendre les transferts sur un réseau beaucoup plus rapides. BTW, l'option checksum est mentionnée ci-dessus pour son explication dursync
fonctionnement. Dans la plupart des cas, il ne doit pas être utilisé.Général
Si je comprends bien,
rsync -av
n'a pas de mémoire, il va donc copier les fichiers qui ont été renommés / supprimés aussi, car ils sont présents dans la source mais plus dans la cible.Conseils
Utilisez l'option
-n
«dry run» pour vérifier ce qui se passe avant d'exécuter votrersync
ligne de commande.Notez la signification particulière d'une barre oblique de fin après le répertoire source et voyez la différence entre
et
qui est décrit dans le manuel
man rsync
.Exemple
Votre cas particulier (ajouter un fichier au répertoire source 'a' et supprimer un fichier du répertoire cible 'b') ajoutera à la fois le fichier ajouté et le fichier précédemment copié, car il se trouve toujours dans le répertoire source. Cela se produira à la fois avec et sans l'option
-u
et je ne connais aucune optionrsync
pour résoudre ce problème facilement, si vous souhaitez le conserver dans le répertoire source.Mais vous pouvez le supprimer du répertoire source ou mettre le nom du fichier dans le fichier
excluded
et utiliser l'option--exclude-from=excluded
(pour de nombreux fichiers) ou simplement--exclude=PATTERN
pour un ou quelques fichiers.Alternative:
unison
Vous voudrez peut-être tester l'outil
unison
, qui est un outil de synchronisation . Il fournit une méthode visuelle pour identifier les cas spéciaux et décider quoi faire. Il existe une version GUI (unison-gtk
).la source
unison-gtk
depuis plusieurs années et j'en suis satisfait. (J'utilisersync
aussi.)Il copie uniquement les nouveaux fichiers dans / dir / a. Tout ce que vous faites dans / dir / b sera ignoré, sauf si vous utilisez l'option --delete. Dans ce cas, les fichiers renommés dans / dir / b seront supprimés. Cela forcera / dir / b à devenir exactement comme / dir / a.
À propos du bonus, voulez-vous dire comme dans le cas de renommer des fichiers dans / dir / a, puis de rsynchroniser vers / dir / b? Je ne pense pas qu'il existe un moyen d'empêcher rsync de simplement copier à nouveau les fichiers dans ce cas.
la source