Linux是一个基于文件的操作系统,因此作为文件本身也就有很多属性,如果想要查看某一个文件的属性有两种方式:命令和函数。虽然有两种方式但是它们对应的名字是相同的,叫做stat。另外使用file命令也可以查看文件的一些属性信息。
file
是一个在Linux系统中用于确定文件类型的命令。它通过检查文件的内容、文件系统元数据等信息来推测文件的类型。file
命令的基本语法如下:
file [选项] 文件名
其中,文件名
是要检查的文件的路径。
一些常用的 file
命令选项包括:
-b
:简化输出,只显示文件类型。-i
:显示文件类型和MIME类型。-L
:查看软连接文件自身文件属性-F
:设置输出字符串的分隔符stat命令显示文件或目录的详细属性信息包括文件系统状态,比ls命令输出的信息更详细。语法格式如下:
# 参数在命令中的位置没有限制
$ stat [参数] 文件或者目录名
一些常用的 stat
命令选项包括:
-c
:使用指定格式输出信息。-f
:显示文件系统状态而不是文件状态。-t
:简洁模式,只显示摘要信息, 不显示属性描述-L
:对符号链接进行解引用,显示链接目标的信息。$ stat english.txt
File: 'english.txt'
Size: 129567 Blocks: 256 IO Block: 4096 regular file
Device: 801h/2049d Inode: 526273 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ robin) Gid: ( 1001/ robin)
Access: 2021-01-31 00:00:36.791490304 +0800
Modify: 2021-01-31 00:00:36.791490304 +0800
Change: 2021-01-31 00:00:36.791490304 +0800
Birth: -
在输出的信息中我们可以看到很多属性,
使用 stat 查看软链接类型的文件, 默认显示的是这个软链接文件的属性信息, 添加参数 -L就可以查看这个软连接文件关联的文件的属性信息了。
在 stat
命令中,-c
参数用于自定义输出格式。通过 -c
参数,你可以指定输出的信息,并使用一些格式控制符来代表文件的各种属性。下面是一些常用的 -c
参数格式控制符:
%a
:文件权限,八进制表示。%A
:文件权限,人类可读表示。%n
:文件名。%s
:文件大小(以字节为单位)。%b
:文件的块数。%B
:每块的字节数。%d
:设备编号。%i
:文件的 inode 号。%U
:文件所有者的用户名。%G
:文件所属组的组名。%x
:文件的最后访问时间。%y
:文件的最后修改时间。%z
:文件的最后变化时间。下面是一个使用 -c
参数的 stat
命令的例子:
stat -c "%n Size: %s bytes Owner: %U Group: %G Permissions: %a" filename
stat
和 lstat
是在C语言中用于获取文件或文件系统信息的函数,通常用于检查文件的属性、权限、时间戳等。
stat
函数:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
path
是文件或目录的路径。buf
是一个指向 struct stat
结构体的指针,用于存储获取到的文件信息。stat
函数返回 0 表示成功,-1 表示失败。获取的文件信息存储在 struct stat
结构体中,该结构体的定义如下:
struct stat {
dev_t st_dev; // 设备ID
ino_t st_ino; // 文件的inode
mode_t st_mode; // 文件的类型和权限
nlink_t st_nlink; // 连接到该文件的硬链接数目
uid_t st_uid; // 文件所有者的用户ID
gid_t st_gid; // 文件所有者的组ID
dev_t st_rdev; // 如果是设备文件,表示设备的ID
off_t st_size; // 文件的大小(字节数)
blksize_t st_blksize; // 文件系统的块大小
blkcnt_t st_blocks; // 文件占用的块数
time_t st_atime; // 文件的最后访问时间
time_t st_mtime; // 文件的最后修改时间
time_t st_ctime; // 文件的最后状态变更时间
};
lstat
函数: lstat
函数与 stat
函数相似,但是当文件是符号链接时,lstat
返回符号链接本身的信息,而不是它指向的文件的信息。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int lstat(const char *path, struct stat *buf);
参数和返回值与 stat
函数相同。
下面是一个简单的示例,演示如何使用 stat
函数获取文件信息:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {
const char *filename = "example.txt";
struct stat file_info;
if (stat(filename, &file_info) == 0) {
printf("File Size: %ld bytes\n", file_info.st_size);
printf("Owner UID: %d\n", file_info.st_uid);
printf("Group GID: %d\n", file_info.st_gid);
printf("Permissions: %o\n", file_info.st_mode & 0777);
} else {
perror("stat");
}
return 0;
}
这个示例使用 stat
函数获取了文件的大小、所有者 UID、所属组 GID 以及文件权限信息。