计算每个子目录中具有特定扩展名的文件数量

计算每个子目录中具有特定扩展名的文件数量

来源:任何具有任意数量和类型文件的目录树。问:每个子目录中有多少个.jpg.jpg.png(例如)?

如何限制以下具有 1 个或多个特定扩展名的文件的代码?-type f -name "*.jpg*"例如,插入 时遇到问题。

for DIR in $(find . -maxdepth 99 -type d)
do
    printf "%10d\t%s\n" $(find ${DIR}|wc -l) "${DIR}" 
done

期望输出:

118   ./aaa
 73   ./aaa/bbb
 16   ./aaa/bbb/ccc

如果计算多种文件类型,则应显示每个子目录中的文件总数。

答案1

也许这个find解决xargs方案能够满足您的需要。

find . -mindepth 1 -maxdepth 99 -type d -print0 | \
xargs -0 -i bash -c 'printf "%10d\t%s\n" "$(find "$1" -maxdepth 1 -type f -regextype awk -iregex ".*\.(jpg|jpeg|png)" | wc -l)" "$1"' - '{}'

一些解释:

  • 添加该-mindepth 1选项是为了跳过当前目录并仅处理子目录。
  • 提供-print0带有空分隔符的输出条目,它与 选项一起-0使用xargs
  • - "{}"最后的选项将把参数作为bash 命令xargs第一个位置参数的值传递。$1
  • 第二个find命令-iregex表示不区分大小写的正则表达式(您可以改用-regex)。

答案2

这是我改编的这个答案

find . -maxdepth 100 -type d -print0 | while read -d '' -r dir; do count=$(find "$dir" -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -ls | wc -l); printf "%5d %s\n" "$count" "$dir"; done

将其返回到我的测试目录中。

20 .
11 ./level2
3 ./level2/level3

内容如下:

$ tree -L 3 level1/
level1/
├── 1.png
├── 10.png
├── 11.png
├── 12.png
├── 13.png
├── 14.png
├── 15.png
├── 16.jpg
├── 17.jpg
├── 18.jpg
├── 19.jpg
├── 2.png
├── 20.jpg
├── 3.png
├── 4.png
├── 5.png
├── 6.png
├── 7.png
├── 8.png
├── 9.png
└── level2
    ├── 20.jpg
    ├── 21.jpg
    ├── 22.jpg
    ├── 23.jpg
    ├── 24.jpg
    ├── 25.jpg
    ├── 26.png
    ├── 27.png
    ├── 28.png
    ├── 29.png
    ├── 30.png
    └── level3
        ├── bull_city.png
        ├── man_city.png
        └── newyork_city.png

2 directories, 34 files

刚刚意识到您只需要打印子目录。
find . -mindepth 1 -maxdepth 100 -type d -print0 | while read -d '' -r dir; do count=$(find "$dir" -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -ls | wc -l); printf "%5d %s\n" "$count" "$dir"; done

回買這個。

11 ./level2
3 ./level2/level3

答案3

查找具有逻辑运算符,如 AND、NOT 和 OR。

要指定多个要搜索的扩展,您需要将参数放在括号中,并转义括号以避免它们被 bash 处理:

find . \( -type f -name "*.jpg" -o -name "*.png" \)

相关内容