Он не хранится в этом файле. Он хранится в файловой системе, и все параметры копируются вручную по одному (хотя некоторые не могут быть скопированы вообще).
То есть большинство операционных систем на самом деле не имеют вызова «копировать файл с метаданными». Программа для копирования файлов просто создает новый файл с именем foobar.py
, копирует все 0 байтов данных, затем использует utime () или SetFileTime (), чтобы время его модификации выглядело так же, как и у оригинала. Аналогично, права доступа к файлу «копируются» путем установки их заново с помощью chmod () или путем копирования атрибута POSIX ACL.
Некоторые метаданные не копируются. Установка собственности требует привилегий суперпользователя, поэтому копии чужих файлы принадлежат вам и занять вашу дисковую квоту. Ctime (время изменения атрибута) невозможно установить вручную в Unix; btime (время рождения / создания) обычно тоже не копируется.
Сравните cp -a foo bar
(который копирует метаданные) и cp foo bar
(который не копирует ):
$ strace -v cp foo bar
...
open ("foo", O_RDONLY) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
запись (4, "тест \ n", 5) = 5
читать (3, "", 131072) = 0
close (4) = 0
close (3) = 0
...
$ strace -v cp -a foo bar
...
- исходные метаданные извлекаются
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
- данные копируются
open ("foo", O_RDONLY | O_NOFOLLOW) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
запись (4, "тест \ n", 5) = 5
читать (3, "", 131072) = 0
- время модификации копируется
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
{tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
- собственность копируется (только с 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
- расширенные атрибуты копируются (xdg.origin.url устанавливается браузерами, 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
- POSIX ACL отсутствуют, поэтому базовый ACL создается из st_mode
- (в этом случае простой fchmod () также будет работать)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (данные отсутствуют)
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
close (4) = 0
close (3) = 0
...