//调用opendir和readdir函数对指定目录进行遍历操作

//然后打印输出指定目录中各种类型的文件数目

#include

#include

#include

#include

#include

#include

#include

typedefint Myfunc(const char *, const struct stat *, int);   //定义一个函数

static Myfunc myfunc;

static int myftw(char *, Myfunc *);

static int dopath(Myfunc *);

static long nreg, ndir, nblk, nchr, nfifo, nslink, nsock, ntot;

//各种类型的文件数目对应的变量

char *path_alloc(int* size);

int main(int argc, char *argv[])

{

int ret;

if (argc != 2)

{

printf("请输入正确的参数!\n");   //参数错误

return 1;

}

ret = myftw(argv[1], myfunc);/* does it all */

ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock;

//计算文件总量

if (ntot == 0)     //如果目录中没有文件则将ntot设置为1以避免除数为0

{

ntot = 1;

}

//以下一次打印各种类型文件的数据

printf("普通文件 = %7ld, %5.2f %%\n", nreg, nreg*100.0/ntot);

printf("目录文件 = %7ld, %5.2f %%\n", ndir,ndir*100.0/ntot);

printf("块设备文件 = %7ld, %5.2f %%\n", nblk,nblk*100.0/ntot);

printf("字设备文件 = %7ld, %5.2f %%\n", nchr, nchr*100.0/ntot);

printf("FIFOs = %7ld, %5.2f %%\n", nfifo,nfifo*100.0/ntot);

printf("符号链接文件 = %7ld, %5.2f %%\n", nslink, nslink*100.0/ntot);

printf("套接字文件 = %7ld, %5.2f %%\n", nsock,nsock*100.0/ntot);

return ret;

}

//路径缓冲区分配函数

char *path_alloc(int* size)

{

char *p = NULL;

if(!size)

{

return NULL;

}

p = malloc(256);

if(p)

{

*size = 256;

}

else

{

*size = 0;

}

return p;

}

#defineFTW_F1//

#defineFTW_D2//目录

#defineFTW_DNR3//不能读的目录

#defineFTW_NS4//不能获得状态的文件

static char*fullpath;//存放每个文件完整路径

static int myftw(char *pathname, Myfunc *func)

{

int len;

fullpath = path_alloc(&len);//给路径缓冲区分配一个长度

strncpy(fullpath, pathname, len);//复制文件名称

fullpath[len-1] = 0;

return(dopath(func));

}

//获得文件的状态

static int dopath(Myfunc* func)

{

struct statstatbuf;

struct dirent*dirp;

DIR *dp;

int ret;

char *ptr;

if (lstat(fullpath, &statbuf)

{

return(func(fullpath, &statbuf, FTW_NS));

}

if (S_ISDIR(statbuf.st_mode) == 0)//如果不是目录

{

return(func(fullpath, &statbuf, FTW_F));

}

if ((ret = func(fullpath, &statbuf, FTW_D)) != 0)

{

return(ret);

}

ptr = fullpath + strlen(fullpath);//指向路径缓冲区结尾

*ptr++ = '/';

*ptr = 0;

if ((dp = opendir(fullpath)) == NULL)//如果不能读目录

{

return(func(fullpath, &statbuf, FTW_DNR));

}

while ((dirp = readdir(dp)) != NULL) {

if (strcmp(dirp->d_name, ".") == 0  ||

strcmp(dirp->d_name, "..") == 0)

continue;/* ignore dot and dot-dot */

strcpy(ptr, dirp->d_name);/* append name after slash */

if ((ret = dopath(func)) != 0)/* recursive */

break;/* time to leave */

}

ptr[-1] = 0;/* erase everything from slash onwards */

if (closedir(dp)

{

printf("can't close directory %s\n", fullpath);

}

return(ret);

}

static int myfunc(const char *pathname, const struct stat *statptr, int type)

{

switch (type) {

case FTW_F:

switch (statptr->st_mode & S_IFMT) {

case S_IFREG:nreg++;break;

case S_IFBLK:nblk++;break;

case S_IFCHR:nchr++;break;

case S_IFIFO:nfifo++;break;

case S_IFLNK:nslink++;break;

case S_IFSOCK:nsock++;break;

case S_IFDIR:

printf("for S_IFDIR for %s\n", pathname);

}

break;

case FTW_D:

ndir++;

break;

case FTW_DNR:

printf("can't read directory %s\n", pathname);

break;

case FTW_NS:

printf("stat error for %s\n", pathname);

break;

default:

printf("unknown type %d for pathname %s\n", type, pathname);

}

return(0);

}

linux中如何统计目录中的文件,[Linux目录文件]在Linux中统计目录内文件相关推荐

  1. linux中的tar打包、压缩多个文件、磁盘查看和分区类、du查看文件和目录占用的磁盘空间

    文章目录 1.8.3 tar 打包 1.8.3.1压缩多个文件 1.8.3.2压缩目录 1.8.3.3解压到当前目录 1.8.3.4解压到指定目录 1.9 磁盘查看和分区类 1.9.1 du查看文件和 ...

  2. linux进入文件夹命令,如何在 Linux 中不使用 CD 命令进入目录/文件夹?

    众所周知,如果没有 cd 命令,我们无法 Linux 中切换目录.这个没错,但我们有一个名为 shopt 的 Linux 内置命令能帮助我们解决这个问题. shopt 是一个 shell 内置命令,用 ...

  3. linux终端删除文件命令_如何在Linux终端中删除文件和目录

    linux终端删除文件命令 Fatmawati Achmad Zaenuri/Shutterstock.comFatmawati Achmad Zaenuri / Shutterstock.com T ...

  4. linux中可读可写可执行权限是什么意思,linux chmod 给目录或文件赋权限 可读可写可执行...

    前提: mode权限设定字串,格式:[ugoa...][[+-=][rwxX]...][,...] 其中u表示拥有者(user),g表示与拥有者属于同一个群体(group),o表示其他以外的人(oth ...

  5. 将linux目录中的特定文件推送到手机_linux复制指定目录下的全部文件到另一个目录中,linux cp 文件夹...

    linux复制指定目录下的全部文件到另一个目录中 复制指定目录下的全部文件到另一个目录中 文件及目录的复制是经常要用到的.linux下进行复制的命令为cp. 假设复制源目录 为 dir1 ,目标目录为 ...

  6. linux中tmp目录是什么,Linux文件系统目录标准介绍(FHS)-tmp是什么文件

    概述 在Linux中一切皆文件,而文件是由文件系统组织存放,但文件系统的组织存放方式也是有标准的.一般只要是一个标准化的Linux发行版系统都会遵循这种标准,不然就太混乱了.而这种Linux文件系统标 ...

  7. 7 centos 查看程序文件数量_解析CentOS 7中系统文件与目录管理

    LINUX Linux操作系统 解析CentOS 7中系统文件与目录管理 Linux目录结构 Linux目录结构是树形的目录结构 根目录 所有分区.目录.文件等的位置起点 整个树形目录结构中,使用独立 ...

  8. linux 文件夹换所属用户,Linux中账号管理之权限管理(下)

    linux中的账号管理我们在前面两张已经介绍了一些用户和组的相关概念,常用的配置文件,命令的使用.现在我们来看看账号管理中最傲娇的部分就是我们的权限管理. 一.简单介绍权限的概念 以install.l ...

  9. Linux中把文件夹打成war包,SpringBoot中maven项目打成war包部署在liunx服务器上的方法...

    说明:Spring Boot由于内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再像Spring项目还需要外置的Tomcat等容器来进行部署工作了,通过启动 ...

  10. linux中怎么安装ded包_快速提示:如何在Linux中安装.deb和.tar文件 - push博客

    在本快速教程中,我将解释如何使用终端命令在Linux中安装程序.本教程使用LinuxMint 18(肉桂64位),但是下面提供的命令对于其他版本的Linux是通用的,比如Ubuntu.对于那些刚接触l ...

最新文章

  1. python 列表list 合并的方法
  2. np.trapz 生动的解释
  3. GridView 自写分页 存储过程
  4. 20162302 《程序设计与数据结构》第一周学习总结
  5. 使用gethostname()函数和gethostbyname()函数获取主机相关信息
  6. Treasure Island CodeForces - 1214D(dfs)
  7. 健康丨汗从哪里出 病从哪里来
  8. css怎样定义div大小,css如何设置div大小
  9. 如何weak link一个framework (高版本兼容低版本)
  10. 剑指offer——面试题9:求斐波那切数列的四种方法
  11. AcWing 902. 最短编辑距离(线性DP)
  12. Docker 安装基本操作
  13. 验证性因子分析(三)
  14. 越南无线网dns服务器设置,越南dns 服务器地址
  15. 用PYTHON画谢尔宾斯基三角形(代码可复制)
  16. 微信小程序路线规划导航,选择起点和终点路线规划
  17. 最新邮箱密码破解方法
  18. 一炉真香起静中开鸿蒙翻译,【真 香】_古籍全文检索_诗词名句网
  19. FineBI 无法将聚合和非聚合参数混用(或条件求和)
  20. IOS应用版本号设置

热门文章

  1. ActiveReports 报表控件官方中文新手教程 (1)-安装、激活以及产品资源
  2. Tomcat 服务器只能存有一个正在运行的项目
  3. [CareerCup] 8.10 Implement a Hash Table 实现一个哈希表
  4. centos 修改ip地址
  5. 有人问我,为什么1+1等于2
  6. 深入理解Linux内存映射机制
  7. 信息系统项目管理基础(1)
  8. mac安装python3.7两个版本_MAC下同时安装Python2和Python3
  9. c++实现超声回波包络检测_超声波物位计的选用
  10. mysql_ping()函数的作用以及返回值的类型正确的是,[单选] mysql_ping()函数的作用以及返回值的类型正确的是:()...