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

我发现了这个:

find DIR_NAME -type f ¦ wc -l

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

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


当前回答

在我的电脑上,rsync比在接受的答案中找到| wc -l快一点:

$ rsync --stats --dry-run -ax /path/to/dir /tmp

Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes

第二行是文件的数量,在上面的例子中是150,481。作为奖励,您还可以获得总大小(以字节为单位)。

备注:

第一行是文件、目录、符号链接等的总和,这就是为什么它比第二行大。 ——dry-run(或简称-n)选项对于不实际传输文件非常重要! 我使用-x选项来“不跨越文件系统边界”,这意味着如果你为/执行它,并且附加了外部硬盘,它只会计算根分区上的文件。

其他回答

根据上面给出的回复和评论,我列出了下面的文件计数清单。特别是它结合了@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

对于当前目录:

find -type f | wc -l

这应该可以工作:

find DIR_NAME -type f | wc -l

解释:

-type f只包括文件。 |(而不是……)将find命令的标准输出重定向到wc命令的标准输入。 Wc (word count的缩写)对输入(docs)的换行、单词和字节进行计数。 -l只计算换行。

注:

将DIR_NAME替换为。执行当前文件夹中的命令。 您还可以删除类型f以在计数中包括目录(和符号链接)。 如果文件名可以包含换行符,这个命令可能会被高估。

解释为什么你的例子不起作用:

在您所显示的命令中,您没有使用“Pipe”(|)来连接两个命令,而是使用了shell不将其识别为命令或类似内容的断线(δ)。这就是为什么你会得到错误消息。

找到-type f | wc -l

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

找到。-type f | wc -l

如果你想避免错误的情况,不要让wc -l看到有换行符的文件(它将被算作2+文件)

例:考虑这样一种情况,我们有一个文件,其中只有一个EOL字符

> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2

因为至少gnu wc似乎没有一个选项来读取/计数一个以空结束的列表(除了从文件中),最简单的解决方案就是不传递文件名,而是每次找到文件时输出一个静态输出,例如在上面的同一个目录中

> find -type f -exec printf '\n' \; | wc -l
1

或者你的发现是否支持

> find -type f -printf '\n' | wc -l
1