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 !

0voto

Burcardo Points 101

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 meta de votre bibliothèque musicale).

Cela est basé sur la solution fournie par Stone. Cependant, il s'agit ici de l'heure de modification et d'un script fonctionnel pour restaurer les horodatages. COMMENCEZ d'abord par l'étape un, puis commencez à travailler avec vos fichiers.

  1. Conserver les anciens horodatages. Cela fonctionne à partir du répertoire actuel, exclut tous les fichiers cachés et les enregistre dans le fichier temporaire situé dans /tmp/files. Vous pouvez toujours modifier les paramètres, mais il est préférable de rester avec -printf '"%t" "%p"\n' car la commande touch 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

Attention : fonctionne pour les fichiers avec des espaces dans le nom, des caractères spéciaux, mais par exemple ne fonctionne pas pour les fichiers contenant un signe $.

0 votes

Pour éviter (certains) problèmes avec les barres obliques inverses dans vos noms de fichiers, utilisez read -r ligne. Eh bien, utilisez toujours read avec -r. De plus, vous pouvez éviter d'ouvrir job.sh pour chaque fichier. Il suffit de mettre la redirection à la fin de la commande : while read -r chemin; do echo touch -a -d $chemin ; done < /tmp/times > job.sh

0 votes

2ème mise en garde : Ce script ne transfère pas les horodatages des répertoires. (Eh bien, l'OP ne l'a pas demandé.)

0voto

Pierre Points 101

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

Pour copier l'horodatage de création/modification/accès de n'importe quel fichier vers un autre, vous pouvez utiliser :

touch /c /m /a /r FichierSource FichierDestination

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

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

-1voto

Nathan Points 111

Le manuel de rsync : man rsync répertorie un commutateur -t et -N, ils pourraient valoir la peine d'être manipulés.

0 votes

Je n'ai pas pu voir -N. Pourquoi les recommandez-vous de toute façon?

0 votes

@TomHale -N (--crtimes) existe effectivement, mais uniquement dans les versions plus récentes de rsync. Mais ouais, c'est presque inutile dans ce scénario - cela signifie "préserver les temps de création (nouveauté)" - autant que je sache, "le temps de création du fichier" n'est jamais implémenté par la plupart des systèmes de fichiers Unix, ext4 était le seul système de fichiers majeur à l'avoir inclus dans la spécification, mais n'est toujours pas effectivement implémenté dans le noyau Linux.

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