Em geral, você usaria find
para pesquisar diretórios recursivamente, por exemplo,
find . -name '*.cpp'
Se você tiver o GNU find
, poderá imprimir o nome do arquivo e o tamanho em bytes diretamente, evitando uma chamada para stat
find . -name '*.cpp' -printf '%f:%s\n'
Se você não se importar em reverter o pedido, poderá gerar os resultados de uma maneira que não seja ambiguamente classificável - por exemplo, classificar numericamente de alto a baixo
find ../src -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn
Você sempre pode trocar os campos após a classificação, por exemplo, com Awk - que também permite que você selecione apenas os 5 primeiros resultados, por exemplo:
find . -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn | awk -F: 'NR==6 {exit} {print $2 " : " $1}'
Finalmente, se você quiser tornar seguro qualquer nome de arquivo "legal" (incluindo aqueles com novas linhas), null encerrar tudo
find . -name '*.cpp' -printf '%s:%ffind . -name '*.cpp'
' | sort -t: -zrn | awk -vRS='find . -name '*.cpp' -printf '%f:%s\n'
' -F: 'NR==6 {exit} {print $2 " : " $1}'