web-dev-qa-db-fr.com

Rsync: copie sur les horodatages uniquement

Actuellement, j'ai deux répertoires A/et B/qui sont identiques à tous égards, à l'exception des horodatages. Par conséquent, si j'exécute la commande:

rsync --dry-run -crvv A/ B/

alors tous les fichiers sont marqués "à jour", alors que la commande:

rsync --dry-run -rvv A/ B/

indique que tous les fichiers doivent être copiés de A/vers B /.

Ma question est la suivante: étant donné que je sais que les fichiers sont identiques (en ce qui concerne le contenu), existe-t-il un moyen (via rsync ou autre) de définir les horodatages des fichiers en B/pour être identiques aux horodatages des fichiers en A /, sans copier tous les fichiers de A/vers B /?

Merci

44
artella

En utilisant -t (conserver les horodatages) et --size-only ne comparera les fichiers qu'en fonction de leur taille. Si la taille correspond, rsync ne copiera pas le fichier mais depuis -t est spécifié, il mettra à jour l'horodatage du fichier de destination sans le recopier.

Assurez-vous de ne pas utiliser -u (mise à jour) car cela ignorera les fichiers qui existent déjà et ignorera complètement la mise à jour de l'horodatage.

J'ai eu le problème de ne pas utiliser à l'origine rsync pour copier un tas de fichiers sur un nouveau lecteur, et donc les horodatages ont été mis à jour à l'heure actuelle. J'ai utilisé la commande ci-dessous pour tout synchroniser correctement dans un laps de temps décent:

rsync -vrt --size-only /src /dest
76
Grant Pannell

L'utilisation de --size-only entraînera rsync à ignorer la comparaison des horodatages des fichiers (et donc du contenu des fichiers) si les tailles correspondent. La combinaison avec --times clonera les horodatages sur l'arborescence cible.

6
user115916

Je pense que rsync est le bon outil pour le faire, mais si vous voulez qu'un script le fasse, quelque chose peut donner un bon début.

Vous pouvez obtenir une liste de fichiers avec des horodatages (heures d'accès) comme ceci:

find . -printf '"%p" %a\n' -type f > /tmp/times

Et obtenez-en les commandes de mise à jour temporelle appropriées:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Ce n'est pas un script complet mais un bon point de départ! :)

3
Stone

Utilisez le source (par exemple /path/to/source) comme référence pour la commande tactile. Juste cd dans votre répertoire cible et faites

find -type f -exec touch -r /path/to/source/{} {} \;

Vous ne pouvez pas (encore) copier des horodatages de moins d'une seconde avec rsync.

Cela fonctionne également pour les répertoires et les pseudo-fichiers (il suffit de supprimer ou de modifier le -type f)

2
knorke

Eh bien, vous pouvez certainement écrire un script qui lit l'horodatage d'un côté, puis utilise le toucher pour le définir sur le même fichier de l'autre côté.

Mais cela vous prendra probablement beaucoup plus de temps que de simplement laisser rsync essayer de copier tous les fichiers. Très peu de données seront réellement transférées (uniquement les hachages de blocs si les fichiers sont vraiment identiques). Mais le contenu complet de chaque fichier devra au moins être lu de chaque côté. Donc, vous êtes limité par la bande passante du disque ou les IOPS, cela peut prendre un certain temps. Mais encore probablement moins de temps que d'écrire et de tester un script pour le faire.

1
rmalayter

Pour les gens comme moi qui ont l'intention de modifier les fichiers et qui souhaitent conserver l'horodatage d'origine (par exemple, vous mettez à jour les balises META de votre bibliothèque musicale).

Il est basé sur la solution fournie par Stone. Cependant, voici à propos de l'heure de modification et un script de travail pour restaurer les horodatages. D'abord, effectuez la première étape, puis commencez à travailler avec vos fichiers.

  1. Conserver les anciens horodatages. Il fonctionne à partir du répertoire actuel, exclut tous les fichiers cachés et l'enregistre dans le fichier temporaire dans /tmp/files. Vous pouvez toujours changer les paramètres, mais mieux vaut rester avec -printf '"%t" "%p"\n' puisque la dernière commande touch l'utilise.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Modifiez vos fichiers autant que vous le souhaitez

  3. créez maintenant un fichier qui vous aide à restaurer les horodatages:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. Et enfin appliquer les anciennes dates aux fichiers modifiés

    sh job.sh

Avertissement: fonctionne pour les fichiers avec un espacement de noms, des caractères spéciaux, mais par exemple aucun fichier avec un $ connectez-vous.

0
Burcardo

Meilleure façon de copier uniquement l'horodatage sous Windows:

Pour copier le dernier horodatage créé/modifié/consulté d'un fichier dans un autre, vous pouvez utiliser:

touchez/c/m/a/r SourceFile DestFile

(Cette version de Touch fait partie de la boîte à outils de la console Win32 http://www.stevemiller.net/apps/ )

Robocopie "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY"/E/COPYALL/DCOPY: DAT/XF ./R: 10/W: 5/V/ETA

0
Pierre

Le manuel rsync: man rsync répertorie un -t et -N commutateur, ils pourraient valoir la peine de jouer avec.

0
Tim