Ба. Где проблема в использовании ls или find? Можно также написать однострочный в Perl, чтобы сделать всю работу, а затем просто вызвать однострочный из сценария. ;)
Вы можете сделать свой рекурсивный обход каталога в оболочке и использовать stat для определения размера и владельца. По сути, вы пишете функцию для отображения каталога (для элемента в *), и вам нужно изменить функцию на каталог и вызвать себя, если [[-d $ element]] равно true. Что-то вроде
do_print "$elem"
if [[ -d "$elem" ]]
then
cd "$elem"
process_dir
cd ..
fi
или что-то похожее на это.
Да, у вас будет миллион системных вызовов stat, но IMHO, это, вероятно, предпочтительнее, чем машинный анализ выходных данных программы, вывод которой предназначен для чтения человеком. В этом случае, когда производительность не является проблемой, она того стоит.
Для бонусных супер счастливых забавных моментов замените значение IFS на значение, которое не будет отображаться в имени файла, чтобы не допустить путаницы с оболочкой в файлах, содержащих пробел в своем имени. Я бы предложил либо новую строку, либо косую черту.
Или воспользуйтесь легким выходом и просто используйте find с printf. :)