Показать статистику
0 голосов
от (2.7тыс. баллов)

Источник: Любое дерево каталогов с любым количеством и типом файлов. Q: Сколько .jpg или .jpg и .png (например) в каждом подкаталоге?

Как я могу ограничить приведенный ниже код для файлов с одним или несколькими определенными расширениями? -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

Если подсчитывается более одного типа файлов, то должно отображаться их общее общее количество в каждом подкаталоге.

138 просмотров 2 ответов

2 Ответы

0 голосов
от (26.4тыс. баллов)

Вероятно, это 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.
  • Опция - "{}" в конце будет передавать аргумент xargs как значение первого позиционного параметра $1 команды bash.
  • Во второй команде find подразумевается регулярное выражение без учета регистра ( вместо него -iregex можно использовать ).-regex
0 голосов
от (26.4тыс. баллов)

Поиск имеет логические операторы, такие как AND, NOT и OR.

Чтобы указать более одного расширения для поиска, вам нужно поместить аргументы в круглые скобки, а также экранировать круглые скобки, чтобы избежать их обработки bash:

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

...