Когда дата рождения для файла фактически используется?
Когда я набираю следующее:
$ 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
но это возникло во время цикла разработки, и я скопировал и вставил.
2 ответа
Время рождения - это время, когда файл был создан в файловой системе, также известный как время создания файла (crtime
на EXTFS). Обратите внимание, что это не определено POSIX; только последнее время доступа (atime
), время последней модификации (mtime
) и время смены инода (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
при условии, что ФС рассматриваемого файла находится на разделе /dev/sda1
, Вы можете извлечь значение crtime
чтобы получить время создания файла.
Это должно быть время создания файла, но есть нерешенная проблема, команда gnu coreutils ждет xstat()
поддержка в ядре.