显示文件系统状态命令——stat

本文详细介绍Linux下stat命令的使用方法,包括显示文件或文件系统的状态信息,如何利用各种选项如-L、-f、-t、-c及--printf来定制输出格式,以及通过实例展示如何查看文件大小、时间状态和文件系统信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令stat

  • 用途: 显示文件或文件系统状态,比ls详细

  • 语法: ]# stat [选项] [文件]

  • 选项:

     -L,--dereference            #支持符号连接
     -f,--file-system            #显示文件系统状态而非文件状态
     -t,--terse                  #以简洁的行书打印信息
     -c,--format=格式            #指定格式输出,后边要跟格式
     --printf=格式               #类似--formate,换行需要输入\n
    
  • 输出格式:

     %s          #文件总大小
    
  • 实例:

    ]# stat -c %s 文件                  #显示文件大小
    ]# stat --printf='%s\n' 文件
    
    ]# stat anaconda-ks.cfg             #查看文件的时间状态 Access、Modify、Change
    
    ]# stat -f anaconda-ks.cfg          #查看文件系统信息
    

转载于:https://my.oschina.net/xinsui1314x/blog/3083135

### FatFs 文件系统函数列表及用法 #### 挂载文件系统 为了挂载文件系统,可以使用 `f_mount` 函数。此函数用于关联工作区 (FATFS 对象) 到逻辑驱动器并初始化它。 ```c #include "ff.h" // 定义一个 FATFS 类型的工作区变量 static FATFS fs; // 将工作区挂载到指定的物理盘符 '0' FRESULT res = f_mount(&fs, "", 1); if(res != FR_OK){ // 错误处理代码... } ``` 该过程允许应用程序通过调用其他 API 来访问 SD 卡上的文件和目录[^3]。 #### 显示SD卡信息 要获取已安装卷的信息,可利用 `f_getfree` 获取未分配簇的数量以及每簇字节数: ```c TCHAR path[] = "/"; /* 物理驱动器号 */ DWORD fre_clust; FSIZE_t total_bytes, free_bytes; res = f_getfree(path, &fre_clust, &total_bytes); /* 计算总空间与可用空间 */ free_bytes = ((uint64_t)(fre_clust)) * (_MAX_SS / 512); printf("Total space: %llu bytes\n", total_bytes); printf("Free space : %llu bytes\n", free_bytes); ``` 这段程序展示了如何计算整个存储设备的容量及其剩余可用量[^1]。 #### 读取/写入 TXT 文件 对于简单的文本文件操作,有专门设计来简化这些任务的方法——`f_open`, `f_read`, 和 `f_write`. 打开现有文件或创建新文件: ```c FIL file; /* 文件对象 */ res = f_open(&file, "example.txt", FA_CREATE_ALWAYS | FA_WRITE); if(res == FR_OK){ const char* text_to_write = "Hello world!"; UINT bw; res = f_write(&file, text_to_write, strlen(text_to_write), &bw); if(bw != strlen(text_to_write)){ // 写入失败后的错误处理... } } f_close(&file); ``` 上述例子说明了怎样向名为 example.txt 的文件中追加字符串 “Hello world!” 。如果目标文件已经存在则会被覆盖;否则将会被新建出来。 同样地,可以从现有的 .txt 文件里提取内容: ```c char buffer[128]; /* 缓冲区 */ UINT br; res = f_open(&file, "example.txt", FA_READ); if(res == FR_OK){ while(1){ res = f_read(&file, buffer, sizeof(buffer)-1, &br); if(res || !br) break; buffer[br] = '\0'; // 添加终止符以便打印输出 printf("%s", buffer); } f_close(&file); } ``` 这里实现了逐块读取直到遇到 EOF 或发生异常为止的功能。 #### 获取文件信息 当需要查询特定路径下的某个实体是否确实是一个常规文件而非目录时,应该考虑采用 `f_stat` 方法来进行验证。成功情况下返回的状态码将是 `FR_OK` 并填充给定指针指向的数据结构 (`FILINFO`) 中包含的时间戳和其他元数据字段。 ```c FILINFO fno; res = f_stat("path/to/file_or_directory", &fno); switch(res){ case FR_OK: if(fno.fattrib & AM_DIR){ /* 是目录 */ puts("It's a directory."); }else{ /* 否则是普通文件 */ printf("File size is %u bytes.\n", fno.fsize); } break; default: perror("Error occurred"); } ``` 以上片段解释了怎么判断某项资源究竟是什么类型的节点,并且如果是文件的话还会报告其尺寸大小[^2]。 #### 扫描文件列表 遍历当前目录下所有的条目可以通过循环调用 `f_readdir` 实现。每次迭代都会更新传递过来的对象实例中的成员值以反映下一个匹配项的相关详情直至到达末尾位置(`""`)。 ```c DIR dir; struct _finddata_t ent; res = f_opendir(&dir, "."); if(res == FR_OK){ do{ res = f_readdir(&dir, &ent); if(!strcmp(ent.name,"")) continue; // 跳过根目录本身 if(ent.attrib & AM_DIR){ printf("[D]%s/\n", ent.name); }else{ printf("-%s (%lu)\n", ent.name, ent.size); } }while(res == FR_OK && strcmp(ent.name,"")); f_closedir(&dir); } ``` 本段脚本示范了一种方法去列举出所有直接位于当前工作目录里的项目名称连同它们各自的属性标记一起展示出来。 #### 删除文件 最后一点就是移除不再需要使用的单个文件可通过简单的一行命令完成 —— 使用 `f_unlink` : ```c res = f_unlink("old_file.txt"); if(res == FR_OK){ puts("Successfully deleted old_file.txt!"); }else{ perror("Failed to delete the specified file."); } ``` 这将尝试永久性地从磁盘上去掉所指示的目标文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值