计算多个文件夹中的文件数量(基于文件扩展名)

计算多个文件夹中的文件数量(基于文件扩展名)

我认为最好用一个例子来描述

parent1 (located inside /home/myuser
  - folder1
    - test11.png
    - test11.txt
    - folder11
      - test111.png
    - folder12
      - test121.png
      - test122.png
  - folder2
    - test21.png

如果我可以我的剧本

get-number-of-files-per-folder "parent" png

输出应该是:

folder1: 4
folder2: 1

目前,我正在使用这个命令,但它似乎计算所有文件,而不仅仅是我列出的文件扩展名。

find /home/myuser/parent -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -iname "*png" -type f | wc -l)" file\(s\)' \;

我怎么知道这是错误的?因为当我运行这个时

find /home/myuser/parent -iname '*jpg' -type f | wc -l

它说我有零个 JPG 文件,但上面的脚本说我在文件夹中有 xx 个文件。

答案1

简单的shell脚本方法:

#!/bin/sh

if [ "$#" -ne 2 ]; then
    echo "Usage: $0 directory extension" >&2
    exit 1
fi
cd "$1" || exit 1
for d in *; do
    [ -d "$d" ] || continue
    printf "%s: %i\n" "$d" \
        "$(find "$d" -type f -name "*.$2" -printf '1\n' | wc -l)"
done

…仅使用 shell 迭代目标目录中的所有文件/目录(当然,除了以 开头的隐藏文件/目录.)。它忽略非目录,对于目录,打印出名称,后跟文件计数(通过使用find和获得wc)。这样find … -printf '1\n'find 只打印1它找到的每个文件 - 不打印文件名可以避免所有问题,例如文件名中的换行符。我们只需要计算行数,仅此而已。

答案2

假设 GNU find,并假设您的文件名没有嵌入换行符:

find /path/to/parent1 -mindepth 2 -type f -iname '*.png' -printf '%P\n' | \
    sed 's#/.*##' | \
    sort | \
    uniq -c

答案3

寻找+awk当前文件夹结构的方法/home/myuser/parent1/<folder>

find /home/myuser/parent1 -type f -name "*.png" \
     | awk -F'/' '{ a[$5]++ }END{ for(i in a) print i,a[i] }'
  • $5- 指向所需级别的文件夹名称(如果您的文件夹结构不同,请调整此名称;它应该比父级的目录深度多两个。(因此对于/tmp/parent1它来说是$4,对于/home/myuser/Documents/parent1它来说是$6)。

相关内容