Itu tidak disimpan dalam file itu. Ini disimpan dalam sistem file, dan semua parameter disalin secara manual satu-per-satu (meskipun beberapa tidak dapat disalin sama sekali).
Artinya, sebagian besar sistem operasi tidak benar-benar memiliki panggilan "salin file dengan metadata". Program file-copy hanya membuat file baru bernama foobar.py
, menyalin seluruh 0 byte data, kemudian menggunakan utime () atau SetFileTime () untuk membuat waktu modifikasinya terlihat sama seperti aslinya. Demikian juga, izin file akan "disalin" dengan menetapkannya lagi menggunakan chmod () atau dengan menyalin atribut POSIX ACL.
Beberapa metadata tidak disalin. Mengatur kepemilikan memerlukan hak akses root, sehingga salinan file orang lain milik Anda dan menempati kuota disk Anda . Waktu (atribut perubahan waktu) tidak mungkin untuk diatur secara manual di Unix; btime (waktu kelahiran / penciptaan) biasanya tidak disalin juga.
Bandingkan cp -a foo bar
(yang menyalin metadata) dan cp foo bar
(yang tidak):
$ strace -v cp foo bar
...
open ("foo", O_RDONLY) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
baca (3, "test \ n", 131072) = 5
write (4, "test \ n", 5) = 5
baca (3, "", 131072) = 0
tutup (4) = 0
tutup (3) = 0
...
$ strace -v cp -a foo bar
...
- metadata asli diambil
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 disalin
open ("foo", O_RDONLY | O_NOFOLLOW) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
baca (3, "test \ n", 131072) = 5
write (4, "test \ n", 5) = 5
baca (3, "", 131072) = 0
- waktu modifikasi disalin
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
{tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
- kepemilikan disalin (hanya dengan 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
- atribut diperluas disalin (xdg.origin.url diatur oleh 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
- POSIX ACL tidak ada, jadi ACL dasar dibangun dari st_mode
- (dalam hal ini, fchmod sederhana () akan bekerja dengan baik)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Tidak ada data tersedia)
fsetxattr (4, "system.posix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 377 \ 377 \ 377 \ 377 \ 377 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
tutup (4) = 0
tutup (3) = 0
...