Что означает каждое поле с выводом `stat` в OSX? - PullRequest
0 голосов
/ 19 января 2019
$ stat Cargo.toml
16777220 9094681422 -rw-r--r-- 1 tonytonyjan staff 0 109 "Jan 19 10:05:13 2019" "Dec 31 17:52:29 2018" "Dec 31 17:52:29 2018" "Dec 14 16:32:26 2018" 4096 8 0 Cargo.toml

man stat не объясняет, но упоминает, что вывод получается как lstat:

Отображаемая информация получается вызовом lstat (2) с заданным аргументом и вычислением возвращенной структуры.

После man lstat он дает структуру C, которая выглядит так, как я ищу:

The buf argument is a pointer to a stat structure as defined by <sys/stat.h> and into which information is placed concerning the file.  When the macro
     _DARWIN_FEATURE_64_BIT_INODE is not defined (see below for more information about this macro), the stat structure is defined as:

     struct stat { /* when _DARWIN_FEATURE_64_BIT_INODE is NOT defined */
         dev_t    st_dev;    /* device inode resides on */
         ino_t    st_ino;    /* inode's number */
         mode_t   st_mode;   /* inode protection mode */
         nlink_t  st_nlink;  /* number of hard links to the file */
         uid_t    st_uid;    /* user-id of owner */
         gid_t    st_gid;    /* group-id of owner */
         dev_t    st_rdev;   /* device type, for special file inode */
         struct timespec st_atimespec;  /* time of last access */
         struct timespec st_mtimespec;  /* time of last data modification */
         struct timespec st_ctimespec;  /* time of last file status change */
         off_t    st_size;   /* file size, in bytes */
         quad_t   st_blocks; /* blocks allocated for file */
         u_long   st_blksize;/* optimal file sys I/O ops blocksize */
         u_long   st_flags;  /* user defined flags for file */
         u_long   st_gen;    /* file generation number */
     };

К сожалению, я все еще не могу сопоставить каждое поле с выводом stat, например:

$ stat Cargo.toml
16777220 9094681422 -rw-r--r-- 1 tonytonyjan staff 0 109 "Jan 19 10:05:13 2019" "Dec 31 17:52:29 2018" "Dec 31 17:52:29 2018" "Dec 14 16:32:26 2018" 4096 8 0 Cargo.toml
  • 16777220 - индекс устройства находится на
  • 9094681422 - индекс
  • -rw-r - r-- - режим защиты
  • 1 - количество жестких ссылок
  • tonytonyjan - пользователь
  • персонал - группа
  • 0 - Не уверен. Это тип устройства?
  • 109 - размер
  • «19 января 10:05:13 2019» - последний доступ
  • "31.12 17:52:29 2018" - последняя модификация
  • «31 декабря, 17:52:29 2018» - последнее изменение статуса файла
  • "14 декабря 16:32:26 2018" - Должно было быть только 3 отметки времени, что это?
  • 4096 - размер файла в байтах
  • 8 - блоки, выделенные для файла
  • 0 - оптимальный размер блока ввода-вывода файловой системы? пользовательские флаги? или номер генерации файла?
  • Cargo.toml - имя файла

Мои вопросы:

  1. Первый 0 означает st_rdev?
  2. В чем разница между st_dev и st_rdev?
  3. Что означают секунды 0?
  4. Многие, я не нашел правильную страницу man (ни man stat, ни man lstat). Есть ли официальная документация, которая подробно объясняет каждое поле stat? Где я могу найти это?

1 Ответ

0 голосов
/ 19 января 2019

Используйте stat -s.Он печатает поля в том же порядке, но с метками (и без имени файла):

:; stat -s /etc/man.conf | fmt
st_dev=16777220 st_ino=641593 st_mode=0100644 st_nlink=1 st_uid=0
st_gid=0 st_rdev=0 st_size=4574 st_atime=1547885737 st_mtime=1500152545
st_ctime=1512806119 st_birthtime=1500152545 st_blksize=4194304
st_blocks=0 st_flags=32

Ваше первое загадочное поле - st_rdev, «тип устройства, для специального файлового индекса».Поскольку мы не регистрируем файл устройства, это ноль.

Ваше второе загадочное поле - st_birthtimespec, «время создания файла (рождение)» (см. Справочную страницу stat(2)).Это расширение Дарвина 64-битное.

Ваш 4096 не размер файла в байтах.Это st_blksize, «оптимальный размер блока для ввода / вывода».В моем примере это 4194304. Возможно, ваш файл находится в файловой системе HFS +.Мой находится в файловой системе APFS.

Ваше третье загадочное поле - st_flags, «пользовательские флаги для файла».У тебя ноль, поэтому флаги не установлены.В моем примере (/etc/man.conf) установлено UF_COMPRESSED.

В чем разница между st_dev и st_rdev?

Поле st_dev относится к устройству (жесткий диск / раздел / что угодно), содержащий файл.Поле st_rdev для файлов устройств сообщает ядру, какое устройство представляет сам файл.Попробуйте запустить stat на некоторых файлах устройства в /dev, например /dev/null и /dev/rdisk0, чтобы увидеть ненулевые значения st_rdev.

Многие, я не нашел правильную страницу руководства(ни человек стат, ни человек лстат).Есть ли официальная документация, которая подробно объясняет каждое поле статистики?Где я могу его найти?

Используйте man 1 stat, чтобы узнать о флагах программы командной строки stat, таких как флаг -s, который я использовал.Затем используйте man 2 stat и ваш любимый поисковик, чтобы узнать, что означают поля.

...