Когда фактически используется дата рождения для файла? [дубликат]

На этот вопрос уже есть ответ здесь:

Когда я набираю следующее:

$ IFS=$'\n'; arr=( $(stat "/bin/bash") ); for i in ${arr[@]} ; do echo $i ; done
  File: '/bin/bash'
  Size: 1037528     Blocks: 2032       IO Block: 4096   regular file
Device: 823h/2083d  Inode: 656086      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-23 16:38:03.848124217 -0600
Modify: 2017-05-16 06:49:55.000000000 -0600
Change: 2017-05-18 07:43:22.946694155 -0600
 Birth: -

Я вижу, что дата рождения для / bin / bash пуста. Когда это поле когда-либо использовалось и какое назначение оно могло бы иметь в Linux, когда оно работает?

Я понимаю, что есть более короткий способ использования stat , но это появилось во время цикла разработки, и я скопировал и вставил.

11
задан 23 May 2017 в 20:59

2 ответа

Время рождения является временем, когда файл был создан в файловой системе, также известной как время создания файла (crtime на EXTFS). Обратите внимание, что, это не определяется POSIX; только прошлое время доступа (atime), время последнего изменения (mtime) и inode изменяют время (ctime) получают мандат POSIX.

IIRC, Linux все же не обеспечивает интерфейса для получения времени рождения, существует предложение по xstat() и fxstat(), все же быть реализованным.

Как @muru отмеченный, более новый подход statx(), который недавно объединяется в ядре магистрали. Так, любой (измененный) инструмент пространства пользователя может усилить это ( statx структурируйте теперь, посмотрите ниже) на любом таком недавнем ядре.

struct statx {
    __u32   stx_mask;
    __u32   stx_blksize;
    __u64   stx_attributes;
    __u32   stx_nlink;
    __u32   stx_uid;
    __u32   stx_gid;
    __u16   stx_mode;
    __u16   __spare0[1];
    __u64   stx_ino;
    __u64   stx_size;
    __u64   stx_blocks;
    __u64   __spare1[1];
    struct statx_timestamp  stx_atime;
    struct statx_timestamp  stx_btime;
    struct statx_timestamp  stx_ctime;
    struct statx_timestamp  stx_mtime;
    __u32   stx_rdev_major;
    __u32   stx_rdev_minor;
    __u32   stx_dev_major;
    __u32   stx_dev_minor;
    __u64   __spare2[14];
};

Здесь stx_btime время создания файла.

Тем временем, stat показывает отсутствие полей (или пустые значения) st_birthtime/st_birthtimesec возвращенный stat() звоните, в stat структура:

struct stat {
   dev_t     st_dev;     /* ID of device containing file */
   ino_t     st_ino;     /* inode number */
   mode_t    st_mode;    /* protection *
   nlink_t   st_nlink;   /* number of hard links */
   uid_t     st_uid;     /* user ID of owner */
   gid_t     st_gid;     /* group ID of owner */
   dev_t     st_rdev;    /* device ID (if special file) */
   off_t     st_size;    /* total size, in bytes */
   blksize_t st_blksize; /* blocksize for filesystem I/O */
   blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
   time_t    st_atime;   /* time of last access */
   time_t    st_mtime;   /* time of last modification */
   time_t    st_ctime;   /* time of last status change */
   };

Существуют некоторые приемы с запросом отладки уровня файловой системы для получения информации о создании от метаданных FS, например, для EXTFS:

debugfs -R 'stat /path/to/file' /dev/sda1

принятие FS рассматриваемого файла находится на разделе /dev/sda1. Можно извлечь значение crtime получить время создания файла.

17
ответ дан 23 November 2019 в 03:58

Это должно быть время создания файла, но есть нерешенная проблема, команда gnu coreutils ждет поддержки xstat() в ядре.

TODO: stat (1) и ls (1) поддержка времени рождения

2
ответ дан 23 November 2019 в 03:58

Другие вопросы по тегам:

Похожие вопросы: