如何递归计算多个目录中的文件数?

Maj*_*jiy 4 find files

我有一个目录,里面有很多文件和目录。

我正在尝试获取每个目录中递归包含的文件(和目录)的数量。

我尝试了以下方法:

for dir in $(find -maxdepth 1 -type d); do echo "$dir"; echo find "$dir" | wc -l; done
Run Code Online (Sandbox Code Playgroud)

但这对于每个目录都会返回“1”作为结果。

我知道还有其他几个问题有类似的问题,但我真的很想知道我在上面的代码中的错误是什么。

l0b*_*0b0 6

GNU ( bash, wcand find) 解决方案,适用于任何路径,甚至包含空格、换行符或以破折号开头的路径

shopt -s nullglob
for dir in ./*/
do
    printf '%s\n' "$dir"
    find "$dir" -mindepth 1 -printf x | wc --chars
done
Run Code Online (Sandbox Code Playgroud)

解释:

  • nullglob如果不./包含目录,该选项可防止错误。
  • ./目录中的水珠确保文件名以破折号(” -“)将不会弄乱echofind
  • glob 末尾的斜杠确保只处理目录。
  • -mindepth 1 避免计算目录本身。
  • 如果要包含以顶级点开头的目录,则应shopt -s dotglobfor循环之前运行。

  • +1 为 `-printf x` :否则,默认将输出文件的名称(可能:包含“换行符”,因此被计数两次。或者包含其他内容,例如“NULL”字符,使很多命令窒息) (2认同)