Linux 系统中,查看指定文件夹内各个子文件夹内的文件数量

本文介绍了一个使用bash编写的脚本,该脚本能够统计指定目录及其子目录下的文件数量,并按目录分别列出计数结果。通过调用find命令并结合管道操作,实现了对目录结构的有效遍历和文件计数。

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

count脚本

#!/bin/sh

numOfArgs=$#
if [ $numOfArgs -ne 1 ]; then
    echo -e "Usage: \nbash $0 dirForCount"
    exit -1
fi

# args
ROOTDIR=$1

# core part
find $ROOTDIR -maxdepth 1 -type d | sort | while read dir; do
count=$(find "$dir" -type f | wc -l)
echo "$dir: $count"
done

执行

$ bash count.sh benchmark
benchmark: 2317
benchmark/0: 20
benchmark/1: 891
benchmark/2: 65
benchmark/3: 13
benchmark/4: 1328

参考

linux如何显示一个目录下各子目录的文件个数

<think>我们通常使用`ls`命令结合`wc`命令来统计文件夹中的文件数量(不包括隐藏文件)。如果要包括隐藏文件(以点开头的文件),则需要使用`ls-a`。但是注意,`ls-a`会包含当前目录`.`和上级目录`..`,所以我们需要用`grep`过滤掉这两个。更推荐的方法是使用`find`命令,因为它更精确且可以避免一些解析问题。方法1:使用`ls`和`wc`(不包含隐藏文件)```bashls -l |grep "^-"| wc -l```解释:`ls-l`列出详细信息,每一行代表一个文件或目录。以`-`开头的行表示普通文件。然后`grep"^-"`过滤出普通文件,再用`wc-l`统计行数。方法2:包含隐藏文件(排除.和..) ```bashls -la| grep"^-"| wc -l```但是这样会把`.`和`..`也列出来,而`ls -la`输出的`.`和`..`也是以`d`开头(目录),所以不会被`grep"^-"`匹配到。所以实际上,我们只需要用`ls-A`(不包含.和..)然后再用`grep`过滤文件。方法3:更好的方法,使用`find`命令(不会将目录计入,且可以递归)如果只是当前目录(非递归): ```bashfind .-maxdepth1 -type f| wc -l```解释:`-maxdepth1`表示只在当前目录,`-type f`表示只找文件,然后通过`wc -l`统计行数。如果包括隐藏文件,`find`命令默认会包括隐藏文件。但是注意:`find .`会包括当前目录`.`,所以它会列出当前目录下的所有文件(包括隐藏的),但不包括目录本身(`.`是一个目录,不会被`-typef`匹配)。所以这个命令是准确的。另外,如果文件名中包含换行符,那么上述方法会不准确(因为每一行一个文件名)。但是一般情况下,文件名中不包含换行符。如果考虑换行符,可以使用`find`的`-print0`和`wc`的`-0`选项,但这样统计行数就不对了,因为变成了以空字符分隔。我们可以用:```bashfind. -maxdepth1-typef -print0 |grep-zc.```但这样比较复杂,通常我们假设文件名不包含换行符。所以,最常用的还是: ```bashfind .-maxdepth1 -type f| wc -l```方法4:使用`shopt`(在bash中)开启dotglob选项,然后使用数组(在脚本中)在bash脚本中: ```bashshopt-sdotglobfiles=(*) echo${#files[@]} ```但是这样会把目录也包含进来。所以我们需要过滤掉目录。因此,我们通常还是使用`find`。总结:简单快速的方法(在终端使用):1.不包含隐藏文件:`ls-l| grep-c"^-"`2.包含隐藏文件(排除.和..):`ls-A| grep-c"^-"`是不行的,因为`ls -A`只列出文件名,没有类型标识。所以我们可以:```bashls -A |wc -l#但是这样会把目录也统计进去```所以我们需要一个能够区分文件和目录的方法。因此,更可靠的方法是使用`find`。我们给出一个可靠的包含隐藏文件的统计(不递归,不包含子目录): ```bashfind .-maxdepth1 -type f| wc -l```但是,这个命令会包括当前目录下的所有文件,包括隐藏文件,且不包括子目录。注意:`find .`会包括当前目录下的文件,但不会包括以`.`开头的目录(除非它们里面有文件,但这里我们限制在`-maxdepth1`且`-typef`,所以只包括文件)。然而,`find .`会输出一个`.`开头的路径,比如`./file`,所以每个文件都会有一个`./`前缀,但这不影响行数统计。另外,`find`会包括隐藏文件(因为`find`默认就会查找隐藏文件)。所以,我们推荐使用`find`命令。但是,如果我们要统计当前目录下的文件(包括隐藏文件,不包括目录)的数量,使用: ```bashfind .-maxdepth1 -type f| wc -l```如果我们要统计当前目录下的所有文件(包括隐藏文件)和目录(包括隐藏目录)的数量,则使用:```bashls-A| wc -l```因为`ls-A`会列出除了`.`和`..`以外的所有文件和目录(包括隐藏的),然后`wc -l`统计行数。所以,根据需求选择:1.只统计文件(不包括目录),用`find`。2.统计文件和目录的总数(不包括`.`和`..`),用`ls-A| wc -l`。问题:如何统计目录的数量?同样,用`find`:```bashfind. -maxdepth1-typed |wc-l```但是注意,这个命令会包括当前目录`.`,所以结果会多1。我们可以:```bashfind. -maxdepth1-typed !-name"." |wc-l```或者使用:```bashls-l|grep "^d"| wc -l#不包括隐藏目录?不,ls-l不会显示隐藏文件吗?会显示,所以包含隐藏目录。 ```但是`ls-l`不会显示隐藏文件(除非用`-a`或`-A`),所以我们要用:```bashls-lA |grep "^d"| wc -l```这样会包括当前目录下的所有目录(包括隐藏目录),但是不包括`.`和`..`(因为`ls-A`已经排除了它们),所以这个命令统计的是当前目录下的目录(包括隐藏目录)的数量。因此,总结如下:1.当前目录下的文件数量(包括隐藏文件,不包括目录):```bashfind .-maxdepth1 -type f| wc -l```2.当前目录下的目录数量(包括隐藏目录,不包括`.`和`..`):```bashls-lA |grep "^d"| wc -l```或者```bashfind .-maxdepth1 -type d! -name "."| wc -l```3.当前目录下的文件和目录总数(包括隐藏的,不包括`.`和`..`):```bashls -A |wc-l```注意:以上命令在大多数Linux系统上有效。在Mac上,`find`命令的用法相同,但`ls`命令可能略有不同。如果我们需要在脚本中使用,建议使用`find`,因为它的输出格式更稳定(尽管`ls`在大多数情况下也工作良好,但解析`ls`的输出有时会遇到问题)。因此,回答用户的问题:查看文件夹中有多少文件(这里假设用户指的是普通文件,不包括目录),我们推荐:```bashfind. -maxdepth1-typef |wc-l```如果用户想要包括子目录,那么去掉`-maxdepth1`即可。但是用户的问题没有明确是否递归,通常默认是不递归(即只当前目录)。所以用`-maxdepth1`。另外,用户可能指的是所有类型的文件(包括目录、符号链接等),但问题中只说了“文件”,在Linux中通常“文件”包括普通文件、目录、符号链接、设备文件等。但日常使用中,用户可能只关心普通文件。所以我们需要澄清。然而,问题描述是“查看文件夹中有多少文件”,在Linux中,文件夹(目录)本身也是一种文件。所以严格来说,应该包括目录。但通常,用户可能只想知道普通文件数量。由于问题不明确,我们给出两种可能:1.统计当前目录下所有类型的文件(包括目录、符号链接等)的总数(不包括`.`和`..`):```bashls-A| wc -l```2.只统计普通文件(不包括目录和符号链接等):```bashfind .-maxdepth1 -type f| wc -l```如果用户想要包括符号链接(指向文件的),那么:```bashfind .-maxdepth1 -type f-o-typel |wc-l```但是注意,符号链接可能是链接到目录的,如果只想包括链接到普通文件的,那就不行,因为`find`的`-type l`会包括所有链接。因此,我们需要根据用户的具体需求来调整命令。由于问题没有明确,我们给出最常用的两种:-普通文件(不包括目录和链接):`find .-maxdepth1 -type f| wc -l`-所有条目(包括目录、链接、普通文件等):`ls -A |wc-l`我们假设用户想要的是普通文件数量(这也是最常见的需求),所以给出:```bashfind. -maxdepth1-typef |wc-l```解释:`find .`从当前目录开始查找,`-maxdepth1`表示只查找当前目录(不递归子目录),`-type f`表示只查找普通文件,然后通过管道将找到的文件名输出,`wc-l`统计行数(即文件数量)。注意:如果文件名包含换行符,这个统计会不准确。但在实际中,文件名包含换行符的情况非常罕见。如果用户需要处理包含换行符的文件名,可以使用:```bashfind. -maxdepth1-typef -printf '.'| wc -c```这个命令为每个文件打印一个点,然后统计字符数(即文件数)。但是,这个命令的格式是find的特定参数,不是所有系统都支持(比如Mac的find可能不支持`-printf`)。所以,一般情况下,我们使用第一种方法。因此,最终答案:在Linux中,要查看当前文件夹中普通文件数量(不包括目录和子目录,但包括隐藏文件),可以使用: ```bashfind .-maxdepth1 -type f| wc -l```如果还想包括子目录中的文件,则去掉`-maxdepth1`。如果用户想要统计包括目录在内的所有文件系统对象,那么使用:```bashls-A| wc -l```请根据实际需求选择合适的命令。相关问题:1.如何递归统计当前目录及子目录下的文件数量?2.如何统计当前目录下隐藏文件数量?3.如何统计当前目录下的目录数量?4.如何统计当前目录下每种类型的文件(普通文件、目录、符号链接)的数量?</think>在 Linux 中,查看文件夹中的文件数量有多种方法,以下是几种常用且可靠的方式: ### 方法 1:使用 `find` + `wc`(推荐) ```bash find /path/to/directory -maxdepth 1 -type f | wc -l ``` - **解释**: - `find /path/to/directory`:在目标目录中搜索 - `-maxdepth 1`:仅搜索当前目录(不递归子目录) - `-type f`:只统计普通文件(不包括目录/符号链接) - `wc -l`:统计输出行数(即文件数量) - **优点**:精确统计普通文件,排除目录/隐藏文件干扰 ### 方法 2:使用 `ls` + `wc`(快速统计) ```bash ls -l /path/to/directory | grep "^-" | wc -l ``` - **解释**: - `ls -l`:长格式列出文件(首字符 `-` 表示普通文件) - `grep "^-"`:筛选以 `-` 开头的行(普通文件) - `wc -l`:统计匹配行数 - **注意**:会忽略隐藏文件文件名以 `.` 开头) ### 方法 3:统计包含隐藏文件 ```bash ls -Al /path/to/directory | grep "^-" | wc -l ``` - **关键**:`-A` 参数显示隐藏文件(但不包含 `.` 和 `..`) ### 方法 4:统计所有条目(文件+目录) ```bash ls -A /path/to/directory | wc -l ``` - **解释**: - `-A`:列出所有条目(包括隐藏文件/目录) - `wc -l`:直接统计行数 - **注意**:包含子目录在内 --- ### 示例演示 假设目录 `/home/user/docs` 包含: - 5 个普通文件 - 2 个隐藏文件 - 3 个子目录 执行命令: ```bash find /home/user/docs -maxdepth 1 -type f | wc -l ``` 输出: ```plaintext 7 # 5个普通文件 + 2个隐藏文件 ``` --- ### 特殊场景处理 1. **文件名含空格/换行符**: ```bash find /path -maxdepth 1 -type f -printf '.' | wc -c ``` - 为每个文件打印一个字符,避免换行符干扰 2. **仅统计可见文件**(排除隐藏文件): ```bash find /path -maxdepth 1 -type f ! -name ".*" | wc -l ``` --- ### 总结建议 - **精确统计文件** → 用 `find -type f` - **快速统计条目** → 用 `ls -A | wc -l` - **包含隐藏文件** → 添加 `-A` 或 `! -name ".*"`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Digital2Slave

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值