Linux下递归读取文件数量

本文介绍了一个C语言函数,用于计算指定目录下所有普通文件的数量,通过递归遍历目录并计数。

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

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#define MAX 1024
/* get_file_count函数的参数是一个路径,表示目录树的根。
* 该函数返回参数指定目录下所有普通文件的数目。
*/
int get_file_count(char *root)
{
	DIR * dir;
	struct dirent * ptr;
	int total = 0;			/* 文件总数 */
	char path[MAX];
	dir = opendir(root); /* 打开目录 */
	if(dir == NULL){
		perror("fail to open dir");
		exit(1);
	}
	errno = 0;
	while((ptr = readdir(dir)) != NULL){ /* 顺序读取每一个目录项 */
		/* 跳过".."和"."两个目录 */
		if(strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0)
			continue;
		if(ptr->d_type == DT_DIR){ /* 如果是目录,则递归调用get_file_count函
									数 */
			sprintf(path, "%s/%s", root, ptr->d_name);
			total += get_file_count(path);
		}
		if(ptr->d_type == DT_REG) /* 如果是普通文件,则总数递增 */
			total++;
	}
	if(errno != 0){ /* 如果errno是0,则说明目录中目录项已经全部读完 */
		perror("fail to read dir");
		exit(1);
	}
	closedir(dir); /* 注意一定要关闭目录 */
	return total; /* 返回普通文件数 */
}
int main(int argc, char * argv[])
{
	int total;
	if(argc != 2){ /* 命令行参数错误 */
		printf("wrong usage\n");
		exit(1);
	}
	total = get_file_count(argv[1]); /* 得到文件数目 */
	printf("%s has %d files\n", argv[1], total);
	return 0;
}

<think>好的,用户想知道在Linux中如何统计文件夹内的文件数量。首先,我需要回忆一下相关的命令和方法。记得常用的命令ls、wc和grep的组合使用。例如,使用ls -l列出详细信息,然后通过grep过滤以"-"开头的行,因为这些行代表文件,而目录则以"d"开头。最后用wc -l统计行数。 接下来,我需要确认不同情况下的具体命令。比如统计当前目录下的文件数量,可以用ls -l | grep "^-" | wc -l。如果包含子目录,可能需要使用递归选项,比如ls -lR,然后同样过滤和统计。用户可能还需要统计隐藏文件,这时候可能需要加上-a选项,比如ls -lA。 然后,用户可能还想区分文件文件夹数量,这时候可以分别用grep "^d"来统计目录的数量,以及用grep "^-"来统计文件数量。另外,使用脚本的话会更方便,可以提示用户输入路径,然后分别计算文件和目录的数量,并输出结果。例如,创建一个shell脚本,使用read命令获取路径,然后用变量存储文件数和目录数,最后打印出来。 还要注意是否需要包含隐藏文件,因为默认的ls不会显示以点开头的文件,所以加上-A选项可以包含隐藏文件但不包括.和..。可能还需要提醒用户执行脚本时需要赋予执行权限,或者使用sh命令直接运行。 另外,用户提供的引用中有不同的方法,比如引用1中的脚本,引用2中的递归统计,引用3中的指定目录,引用4中的目录数量统计,引用5中的简单行数统计。需要综合这些信息,整理出不同场景下的命令,并确保命令的正确性。 最后,要组织回答结构,分点说明不同情况,如基本统计、包含子目录、统计目录数量、使用脚本等,并给出示例命令和可能的注意事项,比如权限问题、隐藏文件的处理等。同时,生成相关问题,帮助用户进一步学习,比如统计特定类型文件或排除子目录的方法。</think>在Linux系统中,统计文件夹文件数量的方法主要有以下几种,根据不同的需求可以选择对应的方案: ### 一、基础统计方法 1. **统计当前目录可见文件数量** `ls -l | grep "^-" | wc -l` 原理:`ls -l` 列出详细信息,`grep "^-"` 筛选以 `-` 开头的行(普通文件),`wc -l` 统计行数[^2][^5]。 2. **包含隐藏文件的统计** `ls -lA | grep "^-" | wc -l` 说明:`-A` 参数显示隐藏文件(排除 `.` 和 `..`),适合需要统计隐藏文件的场景[^1]。 ### 二、包含子目录的递归统计 1. **递归统计所有文件(含子目录)** `ls -lR /目标路径 | grep "^-" | wc -l` 示例:`ls -lR ./data/ | grep "^-" | wc -l` 统计 `data` 目录下所有文件[^3]。 2. **同时统计文件和目录数量** ```bash # 文件数量 ls -lR /路径 | grep "^-" | wc -l # 目录数量 ls -lR /路径 | grep "^d" | wc -l ``` 通过 `grep "^d"` 筛选目录行(以 `d` 开头)[^4]。 ### 三、脚本自动化统计 1. **创建脚本 `count_file_num.sh`** ```bash #!/bin/bash read -p "请输入需要统计的文件夹的绝对路径:" fpath file_num=$(ls -lA "$fpath" | grep "^-" | wc -l) dir_num=$(ls -lA "$fpath" | grep "^d" | wc -l) echo "文件数量:$file_num" echo "目录数量:$dir_num" ``` 执行命令:`sh count_file_num.sh`,输入路径后自动输出结果[^1]。 ### 四、注意事项 - **权限问题**:若目录无读取权限,需使用 `sudo` - **符号链接**:上述命令不统计符号链接指向的文件,需添加 `-L` 参数追踪链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值