Рейтинг:4

Count number of files with specific extension(s) for each subdirectory

флаг mx

Source: Any directory tree with any number and type of files. Q: How many .jpg or .jpg and .png (for example) are in each subdirectory?

How can I limit the code below for files with 1 or more specific extension(s)? Having trouble inserting the -type f -name "*.jpg*", for example.

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

Desired output:

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

If more than one file types are counted, then their combined total number in each subdirectories should be displayed.

Liso avatar
флаг sd
Вы хотите объединить результат `.jpg` и `.png`?
Рейтинг:4
флаг cn

Наверное это найти|xargs решение будет работать так, как вам нужно.

найти . -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"' - '{}'

Некоторые пояснения:

  • -глубина 1 добавлена ​​опция для пропуска текущего каталога и обработки только подкаталогов.
  • -print0 предоставляет выходные записи с нулевым разделителем, он работает вместе с -0 вариант xargs.
  • Опция - "{}" в конце пройдет xargs аргумент как значение первого позиционного параметра $1 команды bash.
  • В течение второго найти команда -iregex означает регулярное выражение без учета регистра (вы можете использовать -regex вместо).
user3026965 avatar
флаг mx
элегантный! есть ли простой способ подавить перечисление тех подкаталогов, где count = 0? (например, нет файлов, соответствующих `*\.(jpg|jpeg|png)"`).
pa4080 avatar
флаг cn
Привет, @user3026965, самый простой способ подавить эти строки — добавить `| grep -Pv '^\s+0'` в конце команды. Опция `-P` включает расширенные регулярные выражения, `-v` подавляет совпадающие строки, а само регулярное выражение означает строку, которая начинается `^` с одного или нескольких пробелов `+`, `\s`, за которыми следует `0`.
Рейтинг:3
флаг sd

Вот из моего, модифицированного из этот ответ.

найти . -maxdepth 100 -тип d -print0 | при чтении -d '' -r реж; do count=$(find "$dir" -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -ls | wc -l); printf "%5d %s\n" "$count" "$dir"; сделано

Верните это в мой тестовый каталог.

20 .
11 ./уровень2
3 ./уровень2/уровень3

Где содержимое:

$дерево -L 3 уровень1/
1-й уровень/
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
âââ уровень2
    20.jpg
    21.jpg
    22.jpg
    23.jpg
    24.jpg
    25.jpg
    26.png
    27.png
    28.png
    29.png
    30.png
    âââ уровень3
        âââ bull_city.png
        âââ man_city.png
        âââ newyork_city.png

2 каталога, 34 файла

найти . -mindepth 1 -maxdepth 100 -type d -print0 | при чтении -d '' -r реж; do count=$(find "$dir" -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -ls | wc -l); printf "%5d %s\n" "$count" "$dir"; сделано

Верни это.

11 ./уровень2
3 ./уровень2/уровень3
Рейтинг:1
флаг it

Поиск имеет логические операторы, такие как И, НЕ и ИЛИ.

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

найти . \( -type f -name "*.jpg" -o -name "*.png" \)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.