Es ist nicht in dieser Datei gespeichert . Es wird im Dateisystem gespeichert und alle Parameter werden einzeln manuell kopiert (einige können jedoch überhaupt nicht kopiert werden).
Das heißt, die meisten Betriebssysteme verfügen nicht wirklich über einen Aufruf zum Kopieren von Dateien mit Metadaten. Das Dateikopierprogramm erstellt einfach eine neue Datei mit dem Namen foobar.py
, kopiert die gesamten 0-Byte-Daten und verwendet dann utime () oder SetFileTime () , damit die Änderungszeit mit der des Originals übereinstimmt . Ebenso werden Dateiberechtigungen "kopiert", indem sie mit chmod () neu festgelegt werden oder indem das POSIX-ACL-Attribut kopiert wird.
Einige Metadaten werden nicht kopiert. Das Festlegen des Eigentums erfordert Root-Rechte, sodass Kopien der Dateien anderer Personen Ihnen gehören und Ihr Datenträgerkontingent belegen . Die ctime (Attributänderungszeit) kann unter Unixes nicht manuell eingestellt werden. btime (Geburts- / Erstellungszeit) wird normalerweise auch nicht kopiert.
Vergleichen cp -a foo bar
(die Kopien Metadaten) und cp foo bar
(was nicht):
$ strace -v cp foo bar
…
open ("foo", O_RDONLY) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
Schreiben Sie (4, "Test \ n", 5) = 5
read (3, 131072) = 0
close (4) = 0
close (3) = 0
…
$ strace -v cp -a foo bar
…
- Die ursprünglichen Metadaten werden abgerufen
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
- Daten werden kopiert
open ("foo", O_RDONLY | O_NOFOLLOW) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
Schreiben Sie (4, "Test \ n", 5) = 5
read (3, 131072) = 0
- Die Änderungszeit wird kopiert
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
{tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
- das Eigentum wird kopiert (nur mit 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
- Erweiterte Attribute werden kopiert (xdg.origin.url wird von Browsern gesetzt, 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-ACLs sind nicht vorhanden, daher wird eine Basis-ACL aus st_mode erstellt
- (in diesem Fall würde auch ein einfaches fchmod () funktionieren)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Keine Daten verfügbar)
fsetxattr (4, "system.posix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 6 \ 0 \ 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
…