Seu erro imediato é aquele $i
extra no final da invocação find
- basta removê-lo. A ordem dos argumentos para find
é primeiro os diretórios a serem percorridos e, em seguida, a expressão para corresponder.
Eu não entendo o ponto da chamada para tree
: find
pode fazer isso. Com o GNU find (ou seja, no Linux ou Cygwin), supondo que seus diretórios não contenham muitos arquivos .jpg
insanamente, o -execdir
primary em find
permite executar um comando em todos os arquivos correspondentes em um diretório.
find . \( -name '*.jpg' -o -name '*.jpeg' \) -execdir sh -c 'echo "$(du -c "$@" | sed -n "\$s/\t.*//p") ${PWD#$0/}"' $PWD {} +
Observe que as versões do GNU encontradas antes da versão 4.5.9 têm um bug que faz com que -execdir … {} +
execute uma comando por arquivo, o que não é bom aqui. Então você pode ter que trabalhar mais duro.
Você pode percorrer a árvore de diretórios no bash. Defina a opção globstar
para ativar o padrão **/
, que corresponde a qualquer número de níveis de subdiretórios, isto é, enumera subdiretórios recursivamente. Em cada subdiretório, se houver arquivos JPEG, chame du
para calcular seu tamanho total.
shopt -s globstar
for d in **/*/; do
files=("$d/"*.jpg "$d/"*.jpeg)
total=$(du -s -- "$files" 2>/dev/null | tail -n 1)
total=${total%$'\t'*}
echo "$total"$'\t'"$d"
done