Оболочка оценивает командную строку перед выполнением конвейера. Итак, $?
— это значение последней команды, выполненной перед конвейером. Запускается ли сам echo
до или после , который
не имеет значения.
Теперь, если ваш вопрос был конкретно о распространении статуса выхода, вы можете изучить поведение по умолчанию следующим образом:
% false | true
% echo $?
0
% true | false
% echo $?
1
Как видите, статус выхода конвейера — это статус выхода его последней команды.
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
). Подход с использованием простого сценария оболочки:
#!/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
для каждого файла, который он находит — отсутствие печати имени файла позволяет избежать всех проблем, например, с новыми строками в именах файлов. И нам нужно просто посчитать линии, не более того.