Non è memorizzato in quel file. È memorizzato nel filesystem e tutti i parametri vengono copiati manualmente uno per uno (anche se alcuni non possono essere copiati).
Cioè, la maggior parte dei sistemi operativi non ha una chiamata "copia file con metadati". Il programma di copia file crea semplicemente un nuovo file chiamato foobar.py
, copia tutti 0 byte di dati, quindi usa utime () o SetFileTime () per rendere il suo tempo di modifica uguale a quello dell'originale. Allo stesso modo, i permessi sui file sarebbero "copiati" impostandoli nuovamente usando chmod () o copiando l'attributo POSIX ACL.
Alcuni metadati non vengono copiati. L'impostazione della proprietà richiede i privilegi di root, quindi le copie dei file di qualcun altro appartengono a te e occupano la tua quota del disco. Il tempo (cambio tempo attributo) è impossibile da impostare manualmente su Unix; btime (tempo di nascita / creazione) di solito non viene nemmeno copiato.
Confronta cp -a foo bar
(che copia i metadati) e cp foo bar
(che non lo fa):
$ strace -v cp foo bar
...
open ("foo", O_RDONLY) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
write (4, "test \ n", 5) = 5
read (3, "", 131072) = 0
chiudi (4) = 0
chiudi (3) = 0
...
$ strace -v cp -a foo bar
...
- vengono recuperati i metadati originali
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 = 28-12-2016T09: 16: 59 + 0200.879714332,
st_mtime = 2016-12-28T09: 16: 55 + 0.200,816,363098 millions,
st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
- i dati vengono copiati
open ("foo", O_RDONLY | O_NOFOLLOW) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
write (4, "test \ n", 5) = 5
read (3, "", 131072) = 0
- il tempo di modifica viene copiato
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
{tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
- la proprietà viene copiata (solo con 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
- gli attributi estesi vengono copiati (xdg.origin.url è impostato dai browser, 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
- Gli ACL POSIX non sono presenti, quindi viene creato un ACL di base da st_mode
- (in questo caso, funzionerebbe anche un semplice fchmod ())
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Nessun dato disponibile)
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
chiudi (4) = 0
chiudi (3) = 0
...