Il n'est pas stocké dans ce fichier. Il est stocké dans le système de fichiers et tous les paramètres sont copiés manuellement un par un (bien que certains ne puissent pas être copiés du tout).
Autrement dit, la plupart des systèmes d'exploitation n'ont pas vraiment d'appel "copier le fichier avec les métadonnées". Le programme de copie de fichiers crée simplement un nouveau fichier nommé foobar.py
, copie l'intégralité des 0 octets de données, puis utilise utime () ou SetFileTime () pour que son heure de modification soit identique à celle de l'original. De même, les autorisations de fichier seraient "copiées" en les redéfinissant à l'aide de chmod () ou en copiant l'attribut ACL POSIX.
Certaines métadonnées ne sont pas copiées. La définition de la propriété nécessite des privilèges root, donc les copies des fichiers de quelqu'un d'autre vous appartiennent et occupent votre quota de disque. Le ctime (temps de changement d'attribut) est impossible à définir manuellement sur Unixes; btime (heure de naissance / création) n'est généralement pas copié non plus.
Comparez cp -a foo bar
(qui copie les métadonnées) et cp foo bar
(qui ne le fait pas):
$ strace -v cp foo bar
…
ouvert ("foo", O_RDONLY) = 3
ouvert ("bar", O_WRONLY | O_TRUNC) = 4
lire (3, "test \ n", 131072) = 5
écriture (4, "test \ n", 5) = 5
lire (3, "", 131072) = 0
fermer (4) = 0
fermer (3) = 0
…
$ strace -v cp -a foo bar
…
- les métadonnées originales sont récupérées
lstat ("foo", {st_dev = makedev (254, 0), st_ino = 60569468, st_mode = S_IFREG | 0644,
st_nlink = 1, st_uid = 1000, st_gid = 1000, st_blksize = 4096, st_blocks = 8,
st_size = 5, st_atime = 2016-12-28T09: 16: 59 + 0200.879714332,
st_mtime = 2016-12-28T09: 16: 55 + 0200.816363098,
st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
- les données sont copiées
ouvert ("foo", O_RDONLY | O_NOFOLLOW) = 3
ouvert ("bar", O_WRONLY | O_TRUNC) = 4
lire (3, "test \ n", 131072) = 5
écriture (4, "test \ n", 5) = 5
lire (3, "", 131072) = 0
- le temps de modification est copié
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
{tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
- la propriété est copiée (uniquement avec 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
- les attributs étendus sont copiés (xdg.origin.url est défini par les navigateurs, wget)
flistxattr (3, NULL, 0) = 0
flistxattr (3, "user.xdg.origin.url \ 0", 20) = 20
fgetxattr (3, "user.xdg.origin.url", "https://superuser.com/", 22) = 22
fsetxattr (4, "user.xdg.origin.url", "https://superuser.com/", 22, 0) = 0
- Les ACL POSIX ne sont pas présentes, donc une ACL de base est construite à partir de st_mode
- (dans ce cas, un simple fchmod () fonctionnerait aussi)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Aucune donnée disponible)
fsetxattr (4, "system.posix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 6 \ 0 \ 377 \ 377 \ 377 \ 377 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
fermer (4) = 0
fermer (3) = 0
…