J'ai déjà copié des téraoctets de fichiers avec rsync
mais j'ai oublié d'utiliser --archive
pour conserver les attributs spéciaux des fichiers.
J'ai essayé d'exécuter à rsync
nouveau cette fois avec --archive
mais c'était beaucoup plus lent que ce à quoi je m'attendais. Existe-t-il un moyen simple de le faire plus rapidement en copiant simplement les métadonnées de manière récursive?
filesystem
rsync
metadata
Mohammad
la source
la source
Réponses:
Ok, vous pouvez copier le propriétaire, le groupe, l' autorisation et horodatages à l' aide du
--reference
paramètrechown
,chmod
,touch
. Voici un script pour le faireVous devez l'exécuter avec
sudo
(pour autoriser chown) et avec deux paramètres: répertoire source et destination. Le script ne fait que répéter ce qu'il ferait. Si vous êtes satisfait, changez la lignemyecho=echo
avecmyecho=
.la source
touch --reference=otherfile file
. Mise à jour de la réponsetouch
par conception, seuls les temps de modification et d'accès sont modifiés, le temps de "création" n'est pas affecté. (Je pense que ext2 / 3 ne prend pas en charge la modification de ctime de toute façon, mais cela peut être important si vous utilisez NTFS ou similaire).-c
commutateur à latouch
commande pour l'empêcher de créer des fichiers vides dans le$dst_path
.AVERTISSEMENT: Sans solutions de contournement spéciales, GNU
cp --attributes-only
tronquera les fichiers de destination, au moins en Précise. Voir l'édition ci-dessous.Original:
Dans cette situation, vous voulez probablement l'
--attributes-only
option de GNU cp , ainsi que--archive
, comme c'est du code éprouvé, fait tous les attributs agnostiques du système de fichiers et ne suit pas les liens symboliques (les suivre peut être mauvais!):Comme pour les fichiers,
cp
est additif avec des attributs étendus: si la source et la destination ont des attributs étendus, ils ajoutent les attributs étendus de la source à la destination (plutôt que de supprimer tous les xattrs de la destination en premier). Bien que cela reflète commentcp
se comporte si vous copiez des fichiers dans une arborescence existante, ce n'est peut-être pas ce que vous attendez.Notez également que si vous n'avez pas conservé les liens durs la première fois avec
rsync
mais que vous souhaitez les conserver maintenant,cp
cela ne résoudra pas cela pour vous; il vaut probablement mieux relancerrsync
avec les bonnes options (voir mon autre réponse ) et être patient.Si vous avez trouvé cette question en cherchant à séparer et à recombiner délibérément le contenu des métadonnées / fichiers, vous voudrez peut-être jeter un œil au métastore qui se trouve dans les référentiels Ubuntu.
Source: manuel GNU coreutils
Modifié pour ajouter:
cp
depuis GNUcoreutils
> = 8.17 et supérieur fonctionnera comme décrit, mais coreutils <= 8.16 tronquera les fichiers lors de la restauration de leurs métadonnées. En cas de doute, ne l'utilisez pascp
dans cette situation; utiliserrsync
avec les bonnes options et / ou être patient.Je ne recommanderais pas cela à moins que vous compreniez parfaitement ce que vous faites, mais GNU antérieur
cp
peut être empêché de tronquer les fichiers en utilisant l' astuce LD_PRELOAD :la source
errorno
devrait êtreerrno
, non?rsync
avec les bonnes options est une réponse à une autre question ...Traiter la question comme "rsync n'a que des métadonnées à copier, alors pourquoi est-ce si lent et comment puis-je le faire plus rapidement?":
rsync
utilise généralement des temps égaux comme heuristique pour détecter et ignorer les fichiers inchangés. Sans--archive
(spécifiquement, sans--times
), les mtimes des fichiers de destination restent définis au moment où vous les avez synchronisés, tandis que les mtimes des fichiers source restent intacts (en ignorant la supercherie manuelle de votre part). Sans garantie externe de votre part que le contenu des fichiers source n'a pas changé, rsync doit supposer qu'ils pourraient avoir et doit donc les contrôler et / ou les copier à nouveau vers la destination. Ceci, plus le fait--whole-file
implicite pour les synchronisations locales-> locales, rendrsync
sans--times
approximativement l'équivalentcp
pour les synchronisations locales.Pourvu que la mise à jour du contenu des fichiers de destination soit acceptable, ou si les fichiers source sont intacts depuis la copie originale, vous devriez trouver
rsync --archive --size-only
plus rapide qu'un rsync naïf.En cas de doute sur la
rsync
copie qui prend si longtemps,rsync --archive --dry-run --itemize-changes ...
vous le dit en détail, même si elle est laconique.la source
Dans les transferts locaux, lorsque la source et la destination se trouvent sur des systèmes de fichiers montés localement,
rsync
copiera toujours le contenu des fichiers entiers. Pour éviter cela, vous pouvez utiliserla source
rsync
ne pas utiliser le raccourci lorsque les fichiers sont tous les deux dans le chemin local, mais elle n'empêche pasrsync
de copier le contenu.J'ai dû le faire à distance sur un autre ordinateur, donc je ne pouvais pas utiliser - référence
Je l'ai utilisé pour faire le script ...
find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh
Mais assurez-vous qu'il n'y a pas de noms de fichiers avec "en premier" ...
find | grep '"'
Copiez ensuite touch.sh sur votre ordinateur distant et exécutez ...
cd <DestinationFolder>; sh /tmp/touch.sh
Il existe également des options dans find -printf pour imprimer l'utilisateur, le nom du groupe si vous souhaitez les copier.
la source
find
. J'étais dans la même situation - j'ai oublié de copier les attributs, les disques source et de destination étaient déjà sur des machines différentes et je ne voulais pas vraiment inverser cela.