代码之家  ›  专栏  ›  技术社区  ›  mrgloom

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

  •  0
  • mrgloom  · 技术社区  · 6 年前

    My current attemp提供文件总数,而不是每个文件夹:

    ls -d */ | xargs -I {} find {} -name "*.json" | wc -l
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Socowi    6 年前

    命令1

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

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

    此命令假定所有目录都有单行名称。在某些目录名包含换行符的罕见情况下,它可能会失败。某些版本的 dirname , sort uniq -z 所有这些命令。

    命令2

    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/