Как посчитать общее количество файлов во всех подкаталогах?

У меня есть каталог под названием /data/ который содержит две подкаталоги: /data/train/ а также /data/test/, train а также test каждый содержит 101 подкаталога (101 каталог в train и 101 в test).

Эти каталоги содержат изображения в формате JPEG. Я хочу перебрать все каталоги, чтобы:

  1. Подсчитайте общее количество изображений
  2. Подсчитайте количество изображений, содержащихся в каждом каталоге

3 ответа

Решение

Читать man findи делать что-то вроде

find /data/train /data/test -type f -print | wc -l

for dirname in $(find /data/train /data/test -type d -print) ; do
    /bin/echo -e -n "$dirname\t"
    find $dirname -type f -print | wc -l
done

В Python уже есть соответствующие утилиты для такой работы. Как однострочник это будет сделано так:

$ python -u -c 'from os import walk,path; print "\n".join([str(len(f)) +" "+r for r,d,f in walk(".")])'

Или как сценарий, как так:

#!/usr/bin/env python
import os
import sys
for root,dirs,files in os.walk(sys.argv[1]):
    print(root,len(files))

Обратите внимание, что в версии скрипта вы должны вызывать скрипт с каталогом в качестве позиционного параметра:

$ ./count_files.py my_dir/

В чистом виде bash:

for dir in /data/*/; do
    files=( "$dir"/*/* )
    printf "%s\t%s\n" "$dir:" "${#files[@]}"
done

Вывод будет что-то вроде:

/data/test:     5432
/data/train:    1234
Другие вопросы по тегам