Não é armazenado no arquivo. Ele é armazenado no sistema de arquivos, e todos os parâmetros são copiados manualmente um por um (embora alguns não possam ser copiados de forma alguma).
Ou seja, a maioria dos sistemas operacionais não tem uma chamada "copiar arquivo com metadados". O programa de cópia de arquivos simplesmente cria um novo arquivo chamado foobar.py
, copia os 0 bytes inteiros de dados e, em seguida, usa utime () ou SetFileTime ( ) para fazer com que a sua hora de modificação pareça a mesma que a do original. Da mesma forma, as permissões de arquivo seriam "copiadas", definindo-as novamente usando chmod () ou copiando o atributo POSIX ACL.
Alguns metadados não são copiados. A definição de propriedade requer privilégios de root, de modo que as cópias dos arquivos de outra pessoa pertençam a você e ocupem sua cota de disco sua . O ctime (tempo de alteração do atributo) é impossível de ser configurado manualmente nos Unixes; btime (horário de nascimento / criação) geralmente não é copiado.
Compare cp -a foo bar
(que copia metadados) e cp foo bar
(que não):
$ 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 close(4) = 0 close(3) = 0 …
$ strace -v cp -a foo bar … -- original metadata is retrieved 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 -- data is copied 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 -- modifiction time is copied utimensat(4, NULL, [{tv_sec=1482909419, tv_nsec=879714332}, {tv_sec=1482909415, tv_nsec=816363098}], 0) = 0 -- ownership is copied (only with 'sudo [strace] cp') fchown(4, 1000, 1000) = 0 -- extended attributes are copied (xdg.origin.url is set by browsers, wget) flistxattr(3, NULL, 0) = 0 flistxattr(3, "user.xdg.origin.url$ 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 close(4) = 0 close(3) = 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 -- POSIX ACLs are not present, so a basic ACL is built from st_mode -- (in this case, a simple fchmod() would work as well) fgetxattr(3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (No data available) fsetxattr(4, "system.posix_acl_access", "$ strace -v cp -a foo bar … -- original metadata is retrieved 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 -- data is copied 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 -- modifiction time is copied utimensat(4, NULL, [{tv_sec=1482909419, tv_nsec=879714332}, {tv_sec=1482909415, tv_nsec=816363098}], 0) = 0 -- ownership is copied (only with 'sudo [strace] cp') fchown(4, 1000, 1000) = 0 -- extended attributes are copied (xdg.origin.url is set by browsers, wget) flistxattr(3, NULL, 0) = 0 flistxattr(3, "user.xdg.origin.url%pre%", 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 -- POSIX ACLs are not present, so a basic ACL is built from st_mode -- (in this case, a simple fchmod() would work as well) fgetxattr(3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (No data available) fsetxattr(4, "system.posix_acl_access", "%pre%%pre%%pre%%pre%%pre%7777%pre%%pre%7777 %pre%%pre%7777", 28, 0) = 0 close(4) = 0 close(3) = 0 …%pre%%pre%%pre%%pre%7777%pre%%pre%7777 %pre%%pre%7777", 28, 0) = 0 close(4) = 0 close(3) = 0 …