No está almacenado en ese archivo. Se almacena en el sistema de archivos, y todos los parámetros se copian manualmente uno por uno (aunque algunos no se pueden copiar).
Es decir, la mayoría de los sistemas operativos no tienen realmente una llamada "copiar archivo con metadatos". El programa de copia de archivos simplemente crea un nuevo archivo llamado foobar.py
, copia los 0 bytes de datos completos, luego usa utime () o SetFileTime () para que su tiempo de modificación se vea igual que el original. Del mismo modo, los permisos de archivo se "copiarían" configurándolos de nuevo usando chmod () o copiando el atributo POSIX ACL.
Algunos metadatos no se copian. Establecer la propiedad requiere privilegios de root, por lo que las copias de los archivos de otra persona le pertenecen y ocupan su cuota de disco. El ctime (tiempo de cambio de atributo) es imposible de configurar manualmente en Unixes; btime (tiempo de nacimiento / creación) tampoco suele copiarse.
Compare cp -a foo bar
(que copia metadatos) y cp foo bar
(que no):
$ strace -v cp foo bar
...
abierto ("foo", O_RDONLY) = 3
abierto ("barra", O_WRONLY | O_TRUNC) = 4
leer (3, "prueba \ n", 131072) = 5
escribir (4, "prueba \ n", 5) = 5
leer (3, "", 131072) = 0
cerrar (4) = 0
cerrar (3) = 0
...
$ strace -v cp -a foo bar
...
- se recuperan los metadatos originales
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
- los datos se copian
abierto ("foo", O_RDONLY | O_NOFOLLOW) = 3
abierto ("barra", O_WRONLY | O_TRUNC) = 4
leer (3, "prueba \ n", 131072) = 5
escribir (4, "prueba \ n", 5) = 5
leer (3, "", 131072) = 0
- se copia el tiempo de modificación
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
{tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
- la propiedad se copia (solo con 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
- los atributos extendidos se copian (xdg.origin.url se configura mediante navegadores, 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
- Las ACL POSIX no están presentes, por lo que se construye una ACL básica a partir de st_mode
- (en este caso, un simple fchmod () también funcionaría)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (sin datos disponibles)
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
cerrar (4) = 0
cerrar (3) = 0
...