Nie jest przechowywany w tym pliku. Jest przechowywany w systemie plików, a wszystkie parametry są kopiowane ręcznie jeden po drugim (choć niektórych nie można w ogóle skopiować).
Oznacza to, że większość systemów operacyjnych tak naprawdę nie ma wywołania „kopiuj plik z metadanymi”. Program do kopiowania plików po prostu tworzy nowy plik o nazwie foobar.py
, kopiuje całe 0 bajtów danych, a następnie używa utime () lub SetFileTime (), aby czas modyfikacji wyglądał tak samo jak oryginał. Podobnie uprawnienia do plików byłyby „kopiowane” przez ich ponowne ustawienie za pomocą chmod () lub przez skopiowanie atrybutu POSIX ACL.
Niektóre metadane nie są kopiowane. Ustawienie własności wymaga uprawnień roota, więc kopie plików innych osób należą do ciebie i zajmują miejsce na dysku. Czas ctime (czas zmiany atrybutu) jest niemożliwy do ręcznego ustawienia na Uniksach; btime (czas urodzenia / utworzenia) zwykle również nie jest kopiowany.
Porównaj cp -a foo bar
(które kopie metadanych) icp foo bar
(które nie):
$ 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
odczyt (3, „”, 131072) = 0
close (4) = 0
close (3) = 0
…
$ strace -v cp -a pasek foo
…
- pobierane są oryginalne metadane
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
- dane są kopiowane
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
odczyt (3, „”, 131072) = 0
- czas modyfikacji jest kopiowany
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
{tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
- własność jest kopiowana (tylko z „sudo [strace] cp”)
fchown (4, 1000, 1000) = 0
- kopiowane są rozszerzone atrybuty (xdg.origin.url jest ustawiany przez przeglądarki, 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
- Listy ACL POSIX nie są obecne, więc podstawowa lista ACL jest budowana z trybu st_mode
- (w tym przypadku działałaby również prosta fchmod ())
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Brak danych)
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
…