在Linux系统中统计文件数量是日常运维和操作中常见的需求,不同的统计场景需要选择不同的命令组合来实现,下面介绍几种常用的统计方法。

统计当前目录下的文件数量
如果只需要统计当前工作目录下的普通文件数量,不需要包含子目录中的文件,可以使用ls命令配合wc命令实现。
首先使用ls -l命令列出当前目录下的所有文件和目录的详细信息,然后通过grep命令过滤出普通文件的行,最后用wc -l统计行数,就是文件的总数。
相关命令如下:
# 统计当前目录下普通文件数量,不包含子目录内容 ls -l | grep "^-" | wc -l
这里的grep "^-"是用来匹配以-开头的行,在ls -l的输出中,普通文件的权限位第一个字符就是-,这样就能过滤出普通文件,排除目录、链接等其他类型的文件。
统计包含子目录的所有文件数量
如果需要统计某个目录下所有文件,包括所有子目录中的文件,就需要使用find命令来递归查找所有文件,再统计数量。
使用find命令指定查找的目录,参数-type f表示只查找普通文件,然后通过管道传给wc -l统计数量。
# 统计指定目录及其所有子目录下的普通文件总数,这里以当前目录为例 find . -type f | wc -l
如果要统计指定路径下的文件,只需要把.替换成对应的目录路径即可,比如统计/home/test目录下的所有文件:
find /home/test -type f | wc -l
统计指定类型的文件数量
有时候需要统计某一类后缀的文件数量,比如统计当前目录及子目录下所有的.txt文件数量,可以在find命令中添加名称匹配参数。
# 统计所有txt文件数量 find . -type f -name "*.txt" | wc -l
这里的-name "*.txt"表示匹配所有以.txt结尾的文件名,如果需要忽略大小写,可以把-name换成-iname。
不同统计方式的区别
为了更清晰区分不同命令的作用,下面整理了常用统计方式的适用场景:
| 命令组合 | 适用场景 | 是否包含子目录 |
|---|---|---|
| ls -l | grep "^-" | wc -l | 统计当前目录普通文件 | 否 |
| find 目录 -type f | wc -l | 统计目录及子目录所有普通文件 | 是 |
| find 目录 -type f -name "后缀" | wc -l | 统计指定后缀的所有文件 | 是 |
注意事项
- 使用
ls -l统计时,默认会包含隐藏文件,如果不需要统计隐藏文件,可以把ls -l换成ls -lA | grep "^-"再过滤掉以.开头的文件名。 find命令默认会递归所有子目录,如果只需要查找当前目录不包含子目录,可以添加-maxdepth 1参数,比如find . -maxdepth 1 -type f | wc -l。wc -l统计的是行数,如果文件名中包含换行符,统计结果会出现偏差,这种特殊情况可以使用find的-print0参数配合wc -l的变种方式处理,不过日常使用中很少遇到这类文件名。