comment indiquer à rsync de conserver l'horodatage sur les fichiers lorsque l'arborescence source a un point monté

42

Relatif à cette question

Brève description du problème:

Lorsque l'arborescence source contient un point monté, les horodatages des fichiers situés à l'intérieur de ce point monté lors de la copie dans l'arborescence cible ne sont pas conservés, même si l' -aoption est utilisée .

Description détaillée:

Supposons qu'il s'agit de l'arbre source:

                       /home/                           /home/
                         |                                |
                        me/                             BACKUP/
                         |                                |
                    +----+----------+                +----+-------+
                    |    |          |                |    |       |
                 data/  foo.txt    boo.txt         data/ foo.txt boo.txt
                    |                                |
                   a.txt                           a.txt

data/ci-dessus est monté un disque USB externe. Tout est ext4système de fichiers. Tout dans la source appartient à mon me.

BACKUP se trouvait également être un point de montage, le disque de sauvegarde USB.

Après avoir exécuté cette commande rsync -av --delete /home/me/ /home/BACKUP/, j’ai trouvé que /home/BACKUP/data/tout ce qui se trouvait en dessous avait l’horodatage actuel, comme si ces fichiers étaient créés maintenant, et non l’horodatage des fichiers /home/me/data/. L’ datahorodatage d’ autres dossiers et dossiers situés à l’extérieur a été conservé.

La question est: comment utiliser rsyncle paramètre ci-dessus pour lui dire de conserver les horodatages de tous les fichiers et dossiers, même ceux situés sur un point monté?

J'utilise:

>uname -a
Linux 3.5.0-17-generic #28-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux

>rsync -v
rsync  version 3.0.9  protocol version 30
Nasser
la source

Réponses:

46

de man rsync:

   -t, --times                 preserve modification times

EDIT - pour améliorer cette réponse car il n’est pas évident de comprendre pourquoi cela n’a pas aidé OP:

OP copie des fichiers d’un système de fichiers à un autre et souhaite les conserver c-time. La plupart des gens entendent c-timepar "créer le temps" ce qui est incorrect sur la plupart des systèmes UNIX / Linux (les systèmes de fichiers Windows suivent les temps de "création" ou de "naissance").

La plupart du temps, sous UNIX et Linux, c-timel’horodatage utilisé pour enregistrer le dernier changement de code ' C ' inode. Un inode change si l'un de ses attributs est mis à jour:

OP ne peut pas conserver le contenu c-timede son fichier lorsqu'il est amené sur un nouveau système de fichiers. La création de ces fichiers dans les nouveaux systèmes de fichiers est l’une des conditions énumérées ci-dessus (création d’inode / fichier).

/MODIFIER

h3rrmiller
la source
9
Merci. Je le sais. Mais s'il vous plaît lisez à nouveau la question attentivement. J'ai utilisé -aqui dit: par archive mode; equals -rlptgoD conséquent, -test déjà inclus.
Nasser
1
essayez-vous de préserver le temps de changement? ctime n'est pas pour "créé" c'est pour (changement) de statut
h3rrmiller
1
Je veux que cela fonctionne comme sur les fichiers qui ne sont pas sur le disque monté. c'est-à-dire conserver le même horodatage que celui que l'on voit lors de la création ls -ldu fichier. Cela fonctionne sur les fichiers qui ne sont pas à l'intérieur du point de montage. Cependant, tous les fichiers situés à l'intérieur du point de montage ont un horodatage indiquant qu'ils viennent d'être créés. Quoi que vous appeliez cette fois. Je voulais juste qu'il utilise le même horodatage sur les fichiers de la source. Maintenant ce n'est pas le cas. Je veux que tous les aspects du temps soient copiés. c'est-à-dire qu'un clone du fichier soit créé. heure de création, heure de changement, etc ...
Nasser
4
l'heure de changement (ctime) est mise à jour lors d'une modification de l'inode (c'est-à-dire création / modification de l'autorisation / déplacement / etc.). parce que vous créez un nouvel inode (parce que vous copiez le fichier sur un système de fichiers (tables inode distinctes), ctime est mis à jour. Il n’ya aucun moyen de le contourner, car il s’agit du changement de l’inode, pas du fichier. fr.wikipedia.org/wiki/Stat_(system_call)#ctime
h3rrmiller
3
ls -lmontre mtime (modifier) ​​pas ctime
h3rrmiller
6

comme hr3miller l'a déjà dit, -a (ou --archive) est égal à -rlptgoD et inclut déjà le temps de synchronisation.

Cependant, lorsque rsync copie des données vers, par exemple. un montage NFS / FAT32 / NTFS où la préservation de l'utilisateur et du propriétaire échoue, rsync n'essaiera pas de définir l'heure. Rsync avertira avec quelque chose comme

rsync: chown "/mnt/backup/postgres/hourly.0/primary/var" failed: Operation not permitted (1)

Par conséquent, omettez de conserver l'utilisateur et le groupe en utilisant

-rlptD

au lieu de

-rlptgoD

Utilisez-le uniquement lorsque vous ne conservez pas le propriétaire et le groupe est une option pour vous. Notez que la préservation des liens symboliques et d’autres fonctionnalités peut également déclencher ce comportement. Vous devrez passer par la page de manuel pour chaque fonction rsync (-r -l -p -t -g -o -D-D) que vous souhaitez sauvegarder.

utilisateur1283043
la source
-2

J'utilise rsync -azet chose sûre il me préserve l'heure de modification. Je l'ai vérifié deux fois maintenant.

Mik
la source
2
C'est parce que -a( --archive) comprend -t.
Heemayl
Cependant, ctime ne peut pas être réinitialisé de manière arbitraire. (Désolé, au départ, j'ai mal compris la question.)
Mik