递归计算目录中的所有文件


198

可能重复:
如何使用Linux计算驱动器中的文件夹数量?

我的Linux机器上有一个很深的目录树。我想计算该路径中的所有文件,包括所有子目录。

例如,给定此目录树:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

如果传递了/home,我希望它返回四个文件。或者,如果它返回四个文件和两个目录,则加分。基本上,我希望等效于在Windows上右键单击一个文件夹,然后选择属性,然后查看该文件夹中包含多少个文件/文件夹。

我怎样才能最轻松地做到这一点?我有一个涉及我编写的Python脚本的解决方案,但是为什么它不像运行ls | wc或类似的操作那么容易?


如果您的locate数据库是最新的locate /some/path | wc -l(或在我的Mac上:),则不完全是您要查找的内容,而是要获得非常快速的总计locate -c /some/path。但是:这还将计入中的文件/this/other/path/with/some/path,并将计入文件夹本身。
Arjan

顺便说一句,这是一个不同但密切相关的问题(计算驱动器上的所有目录)和解决方案:superuser.com/questions/129088/…–
Amanda

Answers:


340

find . -type f | wc -l

说明:在此()目录和所有子目录中
find . -type f找到所有文件(-type f),然后按每行标准输出一个文件名。

然后通过管道传递| into wc(word count)-l选项告诉wc只对输入的行数进行计数。

他们一起计算您的所有文件。


1
由于find输出中的最后一个换行符,因此无法处理一次性错误
RobertDeRose

仅计数目录,使用“型d”而不是“型的F”:d
MevlütÖzdemir

1
没有找到文件时,结果是1
Dylanthepiguy

47

上面的答案已经回答了这个问题,但是我要补充一点,如果您使用不带参数的find(希望进行搜索的文件夹除外),如下所示:

find . | wc -l

搜索进行得更快,几乎是瞬时的,或者至少对我有用。这是因为type子句必须在每个名称上运行stat()系统调用以检查其类型-省略它可以避免这样做。

这具有返回文件和文件夹而不是仅文件的数量的区别,但是至少对我来说就足够了,因为我主要使用它来查找哪些文件夹中有大量文件,这些文件永远需要复制和压缩。计数文件夹仍然可以让我找到包含最多文件的文件夹,我需要的是速度,而不是精度。


1
没有找到文件时,结果是1
Dylanthepiguy

25

对于文件:

find -type f | wc -l

对于目录:

find -mindepth 1 -type d | wc -l

它们都在当前工作目录中工作。


1
没有找到文件时,结果是1
Dylanthepiguy

8

使用bash 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

如果要搜索文件和目录,则无需致电两次


8

如果您要计算目录等内容,请稍候更新为已接受的答案

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn

1
Mac / BSD上:(find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn此处,%T对于常规文件,类型为空;对于可执行文件,星号;对于文件夹,%HT则为斜线;因此,需要输入此文本,或者输入一些其他文本,以避免不计算空间,例如> %T。 )
Arjan

在我的10.13.6 Mac电脑上给我“查找:非法选项-e”
K.-Michael Aye
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.