如何递归地计数Linux目录中的文件?
我发现了这个:
find DIR_NAME -type f ¦ wc -l
但是当我运行它时,它返回以下错误。
查找:路径必须在表达式之前:
如何递归地计数Linux目录中的文件?
我发现了这个:
find DIR_NAME -type f ¦ wc -l
但是当我运行它时,它返回以下错误。
查找:路径必须在表达式之前:
当前回答
如果你需要递归计算特定的文件类型,你可以这样做:
find YOUR_PATH -name '*.html' -type f | wc -l
-l只是显示输出中的行数。
如果需要排除某些文件夹,请使用-not -path
find . -not -path './node_modules/*' -name '*.js' -type f | wc -l
其他回答
我编写了ffcnt来加快特定情况下的递归文件计数:支持区段映射的旋转磁盘和文件系统。
它可能比ls或基于find的方法快一个数量级,但是YMMV。
tree $DIR_PATH | tail -1
样例输出:
5309个目录,2122个文件
假设你想要一个每个目录的文件总数,试试:
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
由于UNIX中的文件名可能包含换行符(是的,换行符),wc -l可能会计算过多的文件。我将为每个文件打印一个点,然后计算这些点:
find DIR_NAME -type f -printf "." | wc -c
注意:-printf选项只适用于GNU findutils中的find。你可能需要安装它,比如在Mac上。
综合这里的几个答案,最有用的解决方案似乎是:
find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n
它可以处理一些奇怪的东西,比如文件名中包含空格、圆括号甚至新行。它还根据文件数量对输出进行排序。
您可以增加-maxdepth后的数字,以获得子目录的计数。请记住,这可能会花费很长时间,特别是如果您有一个高度嵌套的目录结构,并结合了一个高-maxdepth值。