64 votes

Rsync : copie uniquement les horodatages

Actuellement j'ai deux répertoires A/ et B/ qui sont identiques en tous points, à 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 comme "à jour", tandis que la commande :

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

montre que tous les fichiers doivent être copiés de A/ à B/.

Ma question est la suivante : sachant que je sais que les fichiers sont identiques (en termes de contenu), y a-t-il un moyen (via rsync ou autrement) de définir les horodatages des fichiers dans B/ pour qu'ils soient identiques aux horodatages des fichiers dans A/, sans copier tous les fichiers de A/ à B/ ?

Merci

0 votes

Si vous savez que les fichiers sont identiques, alors pourquoi devez-vous vous donner du mal à ne pas les copier pour obtenir le horodatage dont vous avez besoin?

5 votes

@Tim : peut-être qu'il y a beaucoup de données.

0 votes

@Tim Aujourd'hui, j'ai passé toute la journée à migrer plus de 300 Go de données sur un réseau lent. Lorsque sftp a terminé, il était déjà minuit. Ce n'est qu'au cours de ma vérification finale en utilisant ls et stat que j'ai réalisé que j'avais perdu tous les horodatages (j'ai oublié d'utiliser sftp -p !) Ils sont importants pour moi pour identifier l'historique des fichiers. J'ai été sauvé par la réponse, rsync -vrt --size-only qui n'a pris que 60 secondes pour s'exécuter !

104voto

user146468 Points 26

En utilisant -t (conserver les horodatages) et --size-only, seuls les fichiers de même taille seront comparés. Si la taille correspond, rsync ne copiera pas le fichier mais puisque -t est spécifié, il mettra à jour l'horodatage sur le fichier de destination sans le recopier.

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

J'ai rencontré le problème de ne pas avoir utilisé rsync initialement pour copier une série 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 synchroniser correctement tout en un temps raisonnable :

rsync -vrt --size-only /src /dest

6 votes

Je suggère également d'ajouter --existing pour empêcher les copies accidentelles de nouveaux fichiers.

2 votes

Le drapeau --archive (ou -a) inclut -r, -t et plus encore :)

0 votes

Préférer cette réponse car rsync fonctionne également sur des machines distantes

8voto

Richard G Points 1

Utiliser --size-only fera que rsync sautera la comparaison des horodatages de fichiers (et donc les contenus de fichiers) si les tailles correspondent. Combinez cela avec --times pour cloner les horodatages dans l'arborescence cible.

0 votes

Ajouter --checksum en plus de cela devrait s'occuper des fichiers de même taille mais de contenus différents.

4voto

knorke Points 31

Utilisez le répertoire de source (par exemple /chemin/vers/source) en tant que référence pour la commande touch. Il vous suffit de faire un cd vers votre répertoire cible et de faire

find -type f -exec touch -r /chemin/vers/source/{} {} \;

Vous ne pouvez pas copier les horodatages avec précision aux sous-secondes avec rsync (pour le moment).

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

0 votes

Cela a été utile pour moi car j'avais besoin d'un temps à copier. J'ai remarqué que cela ne copie pas ctime, ce qui était correct dans mon cas.

0 votes

Il suffit de lire la page de manuel de 'touch'. Vous pouvez définir à la fois l'heure d'accès (atime) et l'heure de modification (mtime) avec cette commande.

0 votes

Oui, je sais que vous pouvez utiliser touch -ar mais cela ne modifie toujours pas l'heure de création. Je suppose que c'est rarement désiré.

3voto

Stone Points 6841

Je pense que rsync est l'outil adapté pour cela, mais si vous souhaitez un script pour le faire, alors quelque chose comme cela peut vous donner un bon départ.

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 obtenir les commandes de mise à jour de l'heure appropriées à partir de cela :

 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! :)

0 votes

Merci. Je pense que je vais probablement rester avec Rsync pour le moment, mais je vais certainement aller sur le web pour apprendre les différents composants de votre script, car cela pourrait être utile à l'avenir.

0 votes

Cela semblait être exactement ma solution! Je veux conserver les horaires tout en ajoutant des métadonnées à ma bibliothèque musicale. Cependant, apparemment il ne peut pas gérer les espaces dans les noms de fichiers ):

1voto

rmalayter Points 3734

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

Mais cela vous prendrait 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 (seulement les hachages de blocs si les fichiers sont vraiment identiques). Mais le contenu complet de chaque fichier devra être lu de chaque côté au moins. Donc si vous êtes limité par la bande passante du disque ou par les IOPS, cela pourrait prendre un certain temps. Mais probablement moins de temps que d'écrire et de tester un script pour le faire.

0 votes

Merci, j'étais inconscient de cette fonction de rsync (elle est aussi discutée dans Wikipédia).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X