подсчитать количество файлов (в зависимости от расширения) в нескольких папках

Оболочка оценивает командную строку перед выполнением конвейера. Итак, $? — это значение последней команды, выполненной перед конвейером. Запускается ли сам echo до или после , который не имеет значения.

Теперь, если ваш вопрос был конкретно о распространении статуса выхода, вы можете изучить поведение по умолчанию следующим образом:

% false | true
% echo $?
0

% true | false
% echo $?
1

Как видите, статус выхода конвейера — это статус выхода его последней команды.

0
20.09.2017, 19:03
2 ответа

find + 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).
1
28.01.2020, 02:14

Подход с использованием простого сценария оболочки:

#!/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

… который просто использует оболочку для перебора всех файлов/каталогов в вашем целевом каталоге (, за исключением скрытых, начинающихся с.). Он игнорирует каталоги, отличные от -, и для каталогов выводит имя, за которым следует количество файлов (, полученное с помощью findиwc). find … -printf '1\n'таков, что find просто печатает 1для каждого файла, который он находит — отсутствие печати имени файла позволяет избежать всех проблем, например, с новыми строками в именах файлов. И нам нужно просто посчитать линии, не более того.

3
28.01.2020, 02:14

Теги

Похожие вопросы