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
rsync
copy
synchronization
timestamp
Artella
la source
la source
Réponses:
Utiliser
-t
(conserver les horodatages) et--size-only
ne comparera que les fichiers en taille. Si la taille correspond, rsync ne copiera pas le fichier, mais comme il-t
est 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:
la source
--existing
pour éviter les copies accidentelles de nouveaux fichiers.--archive
(ou-a
) comprend-r
,-t
en plus :)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.
la source
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:
Et obtenez les commandes de mise à jour du temps appropriées:
Ce n'est pas un script complet mais un bon point de départ! :)
la source
Utilisez le répertoire source (par exemple
/path/to/source
) comme référence pour la commande tactile. Justecd
à votre répertoire cible et faireVous 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
)la source
touch -ar
mais cela ne change toujours pas le ctime. Je suppose que c'est rarement désiré.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.
la source
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.
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 latouch
commande ultérieure utilise cela.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 aidera à restaurer les horodatages:
while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times
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.la source
read -r line
. Eh bien, utilisez toujoursread
avec-r
. En outre, vous pouvez éviter d’ouvrirjob.sh
pour 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
Meilleur moyen de ne copier que l’horodatage sous Windows:
(Cette version de Touch fait partie de la Win32 Console ToolBox http://www.stevemiller.net/apps/ )
la source
Le manuel de rsync:
man rsync
liste les options a-t
et-N
switch, il peut être intéressant de les manipuler.la source
-N
. Pourquoi les recommandez-vous quand même?