来源:任何具有任意数量和类型文件的目录树。问:每个子目录中有多少个.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" \)