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

У этого вопроса уже есть ответ здесь: Как найти время создания файла? 4 ответа

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

$ 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 равна null / empty. Когда это поле когда-либо используется и какая цель может быть у него в Linux, когда оно работает?

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

11
задан 24 May 2017 в 06:59

6 ответов

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

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

Как отметил @muru, в последнее время новый подход xstat() и fxstat() . Таким образом, любой (модифицированный) пользовательский инструмент может использовать это (структура 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
ответ дан 22 May 2018 в 22:18
  • 1
    xstat - древняя история. statx слит совсем недавно. – muru 24 May 2017 в 06:44
  • 2
    Стоит отметить, что время создания файла часто не особенно полезно, так как многие текстовые редакторы будут сохранять, создавая новый файл, а затем перезаписывая старый (значит, вы никогда не получите частично сохраненный файл, если он сработает во время сохранения). В Windows они используют некоторые экстремальные хакеры, чтобы заставить это работать (за исключением случаев, когда этого не происходит - см. blogs.msdn.microsoft.com/oldnewthing/20050715-14/?p=34923 ), но для Мое знание в Linux не существует. – Muzer 24 May 2017 в 14:14
  • 3
    @heemayl Как я Linux C noob и могу только копировать, вставлять & amp; compile, можете ли вы указать на ссылку, где программа C "читает" новой основной структуры данных ядра и печатает ее на STDOUT? (Извините, если терминология отключена). – WinEunuuchs2Unix 24 May 2017 в 14:49
  • 4
    @ WinEunuuchs2Unix Я не думаю, что перезаписанные обычные программы, которые используют statx() вместо stat(), доступны прямо сейчас в любой основной версии такой версии программы ... вы можете проверить последний источник, чтобы убедиться, что если какая-то программа реализовала интерфейс, а затем скомпилировать программу или вы всегда можете написать свою собственную программу, которая использует statx() ... В обоих случаях я предполагаю, что у вас есть требуемая версия ядра, которая предоставляет statx() ... – heemayl 24 May 2017 в 18:36
  • 5
    @heemayl statx() был добавлен в Kernel 4.11, который я установил пару недель назад (версия 4.11.1). Я перезагрузил эту версию и попытаюсь выяснить, разместил ли кто-нибудь образец программы для использования. Если нет, мне придется загрузить исходный код команды stat, изменить его и перекомпилировать. Спасибо за отличный ответ и надеюсь, что через неделю или две я смогу опубликовать рабочую копию новой программы statx :) PS Интересное примечание стороны: statx () содержит новое поле для version number. Это то, о чем я задавал пару дней назад вопрос о том, как определить номер версии программы. – WinEunuuchs2Unix 25 May 2017 в 02:13

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

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

Как отметил @muru, в последнее время новый подход xstat() и fxstat() . Таким образом, любой (модифицированный) пользовательский инструмент может использовать это (структура 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
ответ дан 18 July 2018 в 12:49

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

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

Как отметил @muru, в последнее время новый подход xstat() и fxstat() . Таким образом, любой (модифицированный) пользовательский инструмент может использовать это (структура 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
ответ дан 24 July 2018 в 20:02

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

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

2
ответ дан 22 May 2018 в 22:18

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

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

2
ответ дан 18 July 2018 в 12:49

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

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

2
ответ дан 24 July 2018 в 20:02

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

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