如何计算每个文件夹中的文件?

时间:2019-01-26 21:11:45

标签: bash

我想做的是计算每个文件夹中的json文件。

我当前的尝试给出文件总数,而不是每个文件夹:

ls -d */ | xargs -I {} find {} -name "*.json" | wc -l

1 个答案:

答案 0 :(得分:2)

命令1

以下命令将从工作目录开始递归搜索所有目录。包含至少一个.json文件的目录将与该目录中的json文件数一起列出。

find -type f -iname \*.json -exec dirname {} + | sort | uniq -c

此命令假定所有目录都有单个行名。在某些目录名包含换行符的极少数情况下,它可能会失败。 dirnamesortuniq的某些版本支持空定界符来解决此问题。将-z添加到所有这些命令中。

命令2

要同时打印不包含任何json文件的目录,可以使用以下命令。此命令还处理目录名称中的换行符,并允许自定义输出格式(只需修改echo部分)。

shopt -s globstar nullglob
count() { echo "$#"; }
for d in ./ **/; do
    echo "$(count "$d"*.json) $d"
done

示例

$ tree
.
├── dir1
│   ├── dir3
│   │   ├── a.json
│   │   ├── b.json
│   │   ├── c.json
│   │   └── dir5
│   │       └── alsonotjson
│   └── dir4
├── dir2
│   ├── lorem.json
│   └── yadda.txt
├── notajsonfile
└── somejsonfile.json

5 directories, 8 files
$ find -type f -iname \*.json -exec dirname {} + | sort | uniq -c
      1 .
      3 ./dir1/dir3
      1 ./dir2
$ shopt -s globstar nullglob; count() { echo "$#"; };
$ for d in ./ **/; do echo "$(count "$d"*.json) $d"; done
1 ./
0 dir1/
3 dir1/dir3/
0 dir1/dir3/dir5/
0 dir1/dir4/
1 dir2/

不要递归

仅打印工作目录及其非递归子目录,您可以...

  • -maxdepth 2用于第一个命令。
  • 为第二个命令用普通的**/替换globstar */
$ find -maxdepth 2 -type f -iname \*.json -exec dirname {} + | sort | uniq -c
  1 .
  1 ./dir2
$ shopt -s nullglob; count() { echo "$#"; };
$ for d in ./ */; do echo "$(count "$d"*.json) $d"; done
1 ./
0 dir1/
1 dir2/