Rsync: copier uniquement les horodatages


42

Actuellement, j'ai deux répertoires A / et B / qui sont identiques à tous égards, à l'exception des horodatages. Donc si je lance 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 / à 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 régler l'horodatage des fichiers dans B / pour qu'ils soient identiques à ceux des fichiers dans A /, sans copier tous les fichiers de A / à B /?

Merci


Si vous savez que les fichiers sont identiques, pourquoi devez-vous faire de votre mieux pour ne pas les copier pour obtenir l'horodatage dont vous avez besoin?
Tim

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

Réponses:


75

Utiliser -t(conserver les horodatages) et --size-onlyne comparera que les fichiers en taille. Si la taille correspond, rsync ne copiera pas le fichier, mais comme il -test spécifié, il actualisera l'horodatage sur le fichier de destination sans le recopier.

Assurez-vous de ne pas utiliser -u(update) car cela évitera les fichiers existants et mettra complètement à jour la mise à jour de l'horodatage.

À l’origine, j’ai eu le problème de ne pas utiliser rsync pour copier un groupe de fichiers sur un nouveau lecteur. L’horodatage a donc é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

2
Je suggère également d'ajouter --existingpour éviter les copies accidentelles de nouveaux fichiers.
Leden

1
Le drapeau --archive(ou -a) comprend -r, -ten plus :)
Dor

6

Si vous utilisez --size-only, rsync ignore la comparaison des horodatages de fichiers (et donc du contenu des fichiers) si les tailles correspondent. En combinant ceci avec --times, vous clonerez les horodatages dans l'arborescence cible.


3

Je pense que rsync est le bon outil pour faire cela, mais si vous voulez un script qui le fasse, cela peut donner un bon départ.

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

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

Et obtenez les commandes de mise à jour du temps 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! :)


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

Cela semblait être exactement ma solution! Je veux préserver les temps 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):
Burcardo

2

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

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

Vous ne pouvez pas (pour le moment) copier des horodatages inférieurs à 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)


Cela m’a été utile car j’avais besoin qu’un exemplaire soit copié. J'ai remarqué qu'il ne copie pas ctime, ce qui était correct dans mon cas.
Snapfractalpop

Il suffit de lire la page de manuel de 'touch'. Vous pouvez définir atime et mtime avec cette commande.
knorke

Oui, je sais que vous pouvez utiliser touch -armais cela ne change toujours pas le ctime. Je suppose que c'est rarement désiré.
snapfractalpop

Ah, je vois le problème maintenant. Merci. Oui, ctime est difficile à changer et je ne sais pas pourquoi.
Knorke

1

Eh bien, vous pouvez certainement écrire un script qui lit l’horodatage d’un côté puis utilise touch 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 (ne bloquez le hachage que si les fichiers sont vraiment identiques). Mais le contenu complet de chaque fichier devra être lu au minimum de chaque côté. Donc, vous êtes limité par la bande passante du disque ou IOPS, cela peut prendre un certain temps. Mais encore probablement moins de temps que d’écrire et de tester un script pour le faire.


Merci, je n'étais pas au courant de cette fonctionnalité de rsync (elle est aussi discutée dans Wikipedia).
artella

0

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

C'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. EN PREMIER faites la première étape, puis commencez à travailler avec vos fichiers.

  1. Préserver les horodatages anciens . Il fonctionne à partir du répertoire actuel, exclut tous les fichiers cachés et l’enregistre dans le fichier temporaire au format /tmp/files. Vous pouvez toujours modifier les paramètres, mais il vaut mieux rester avec -printf '"%t" "%p"\n'puisque la touchcommande ultérieure utilise cela.

    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 aidera à restaurer les horodatages:

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

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

    sh job.sh

Caveat: fonctionne pour les fichiers avec un nom d'espacement, des caractères spéciaux, mais par exemple aucun fichier avec un $signe.


Pour éviter (certains) problèmes de barres obliques inverses dans vos noms de fichiers, utilisez read -r line. Eh bien, utilisez toujoursread avec -r. En outre, vous pouvez éviter d’ouvrir job.shpour chaque fichier. Il suffit de mettre la redirection à la fin de la commande:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

2e mise en garde: ce script ne transfère pas l'horodatage des répertoires. (Eh bien, l'OP ne l'a pas demandé.)
hagello

0

Meilleur moyen de ne copier que l’horodatage sous Windows:

Pour copier le dernier horodatage créé / modifié / utilisé de tout fichier sur un autre, vous pouvez utiliser:

touch / c / m / a / r SourceFile DestFile

(Cette version de Touch fait partie de la Win32 Console ToolBox http://www.stevemiller.net/apps/ )

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


-1

Le manuel de rsync: man rsyncliste les options a -tet -Nswitch, il peut être intéressant de les manipuler.


Je ne pouvais pas voir -N. Pourquoi les recommandez-vous quand même?
Tom Hale
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.