我想做的是计算每个文件夹中的json文件。
我当前的尝试给出文件总数,而不是每个文件夹:
ls -d */ | xargs -I {} find {} -name "*.json" | wc -l
答案 0 :(得分:2)
以下命令将从工作目录开始递归搜索所有目录。包含至少一个.json文件的目录将与该目录中的json文件数一起列出。
find -type f -iname \*.json -exec dirname {} + | sort | uniq -c
此命令假定所有目录都有单个行名。在某些目录名包含换行符的极少数情况下,它可能会失败。 dirname
,sort
和uniq
的某些版本支持空定界符来解决此问题。将-z
添加到所有这些命令中。
要同时打印不包含任何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/