【问题标题】:What is the meaning of each field with the output of `stat` on OSX?OSX上“stat”输出的每个字段的含义是什么?
【发布时间】:2019-06-13 07:12:21
【问题描述】:
$ 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 - 设备 inode 驻留在
  • 9094681422 - 索引节点
  • -rw-r--r-- - 保护模式
  • 1 - 硬链接数
  • tonytonyjan - 用户
  • 员工 - 组
  • 0 - 不确定。是设备类型吗?
  • 109 - 尺寸
  • “2019 年 1 月 19 日 10:05:13” - 最后访问
  • “2018 年 12 月 31 日 17:52:29” - 最后修改
  • “2018 年 12 月 31 日 17:52:29” - 最后文件状态更改
  • “Dec 14 16:32:26 2018” - 应该只有 3 个时间戳,这是什么?
  • 4096 - 文件大小(以字节为单位)
  • 8 - 为文件分配的块
  • 0 - 最佳文件系统 I/O 操作块大小?用户定义的标志?还是文件代号?
  • Cargo.toml - 文件名

我的问题:

  1. 第一个0 是否代表st_rdev
  2. st_devst_rdev 有什么区别?
  3. 0 代表什么?
  4. 很多我没有找到正确的man 页面(既没有man stat 也没有man lstat)。是否有任何官方文档详细解释每个 stat 字段?我在哪里可以找到它?

【问题讨论】:

  • 这不是一个真正的编程问题,因此不适合 Stack Overflow。另一个 Stack Exchange 站点会更好。也就是说,试试-s 选项。 ;)
  • unix.stackexchange.com 是这个问题的更好论坛。

标签: macos file unix stat manpage


【解决方案1】:

使用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,即“设备类型,用于特殊文件 inode”。由于我们没有统计设备文件,因此它为零。

您的第二个神秘领域是st_birthtimespec,即“文件创建时间(出生)”(参见stat(2) 手册页)。这是一个 Darwin 64 位扩展。

您的 4096 不是以字节为单位的文件大小。它是st_blksize,“I/O 的最佳块大小”。在我的示例中,它是 4194304。也许您的文件位于 HFS+ 文件系统上。我的是在 APFS 文件系统上。

您的第三个神秘字段是st_flags,“用户定义的文件标志”。你的为零,所以没有设置标志。我的示例 (/etc/man.conf) 设置了 UF_COMPRESSED

st_dev和st_rdev有什么区别?

st_dev 字段是指包含该文件的设备(硬盘驱动器/分区/其他)。设备文件的st_rdev 字段告诉内核文件本身代表什么设备。尝试在/dev 中的某些设备文件上运行stat,例如/dev/null/dev/rdisk0,以查看非零st_rdev 值。

很多时候我没有找到正确的手册页(man stat 和 man lstat 都没有)。有没有详细解释每个统计字段的官方文档?我在哪里可以找到它?

使用man 1 stat 了解命令行stat 程序的标志,例如我使用的-s 标志。然后使用man 2 stat 和您最喜欢的搜索引擎来了解这些字段的含义。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多