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
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
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.
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! :)
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
)
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.
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.
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
Modifiez vos fichiers autant que vous le souhaitez
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
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.
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
Le manuel rsync: man rsync
répertorie un -t
et -N
commutateur, ils pourraient valoir la peine de jouer avec.