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

我发现了这个:

find DIR_NAME -type f ¦ wc -l

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

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


当前回答

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

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

其他回答

假设你想要一个每个目录的文件总数,试试:

for d in `find YOUR_SUBDIR_HERE -type d`; do 
   printf "$d - files > "
   find $d -type f | wc -l
done

对于当前目录,尝试这样做:

for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done;

如果你有很长的空格名,你需要改变IFS,像这样:

OIFS=$IFS; IFS=$'\n'
for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done
IFS=$OIFS
tree $DIR_PATH | tail -1

样例输出:

5309个目录,2122个文件

找到-type f | wc -l

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

找到。-type f | wc -l

如果您想知道当前工作目录中存在多少文件和子目录,可以使用这一行程序

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

这将在GNU风格下工作,对于BSD linux(例如OSX),只需在echo命令中省略-e即可。

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[@]}