Він не зберігається у цьому файлі. Він зберігається у файловій системі, і всі параметри копіюються вручну по одному (хоча деякі з них взагалі неможливо скопіювати).
Тобто більшість операційних систем насправді не мають виклику "копіювати файл з метаданими". Програма копіювання файлів просто створює новий файл з назвою foobar.py
, копіює цілі 0 байти даних, потім використовує utime () або SetFileTime (), щоб зробити час його модифікації таким же, як і оригінальний. Так само, дозволи копіювання файлів будуть "скопійовані", встановивши їх заново за допомогою chmod () або скопіювавши атрибут POSIX ACL.
Деякі метадані не копіюються. Встановлення права власності вимагає кореневих привілеїв, тому копії чужих файлів належать вам і займають вашу дискову квоту. Ctime (час зміни атрибутів) неможливо встановити вручну на Unixes; btime (час народження / створення) зазвичай також не копіюється.
Порівняйте cp -a foo bar
(що копіює метадані) та cp foo bar
(що ні):
$ strace -v cp foo bar
…
відкритий ("foo", O_RDONLY) = 3
відкритий ("бар", O_WRONLY | O_TRUNC) = 4
read (3, "тест \ n", 131072) = 5
написати (4, "тест \ n", 5) = 5
прочитати (3, "", 131072) = 0
закрити (4) = 0
закрити (3) = 0
…
$ strace -v cp -o 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
- дані копіюються
відкритий ("foo", O_RDONLY | O_NOFOLLOW) = 3
відкритий ("бар", O_WRONLY | O_TRUNC) = 4
read (3, "тест \ 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
- ACIX-файлів POSIX немає, тому базовий 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
закрити (4) = 0
закрити (3) = 0
…