如何递归地计数Linux目录中的文件?

我发现了这个:

find DIR_NAME -type f ¦ wc -l

但是当我运行它时,它返回以下错误。

查找:路径必须在表达式之前:


当前回答

找到-type f | wc -l

OR(如果目录是当前目录)

找到。-type f | wc -l

其他回答

综合这里的几个答案,最有用的解决方案似乎是:

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n

它可以处理一些奇怪的东西,比如文件名中包含空格、圆括号甚至新行。它还根据文件数量对输出进行排序。

您可以增加-maxdepth后的数字,以获得子目录的计数。请记住,这可能会花费很长时间,特别是如果您有一个高度嵌套的目录结构,并结合了一个高-maxdepth值。

我编写了ffcnt来加快特定情况下的递归文件计数:支持区段映射的旋转磁盘和文件系统。

它可能比ls或基于find的方法快一个数量级,但是YMMV。

根据上面给出的回复和评论,我列出了下面的文件计数清单。特别是它结合了@Greg Bell提供的解决方案和@Arch Stanton的评论 & @Schneems

计数当前目录和子目录中的所有文件

function countit { find . -maxdepth 1000000 -type d -print0 | while IFS= read -r -d '' i ; do file_count=$(find "$i" -type f | wc -l) ; echo "$file_count: $i" ; done }; countit | sort -n -r >file-count.txt

计数当前目录及子目录中所有给定名称的文件

function countit { find . -maxdepth 1000000 -type d -print0 | while IFS= read -r -d '' i ; do file_count=$(find "$i" -type f | grep <enter_filename_here> | wc -l) ; echo "$file_count: $i" ; done }; countit | sort -n -r >file-with-name-count.txt

bash:

使用()创建一个条目数组,并使用#获取计数。

FILES=(./*); echo ${#FILES[@]}

它不会递归计数文件,但我想先展示一个简单的选项。一个常见的用例可能是创建文件的滚转备份。这将创建日志文件。1,日志文件。2,日志文件。3等。

CNT=(./logfile*); mv logfile logfile.${#CNT[@]}

启用bash 4+ globstar的递归计数(由@tripleee提到)

FILES=(**/*); echo ${#FILES[@]}

要递归地获得文件的计数,我们仍然可以以相同的方式使用find。

FILES=(`find . -type f`); echo ${#FILES[@]}

这将完全正常工作。简单的短。如果要计算文件夹中存在的文件数量。

ls | wc -l