Obtenha o tamanho total das imagens jpeg por diretório em cada diretório contendo jpegs

2

Estou tentando obter um tamanho total por diretório de todas as imagens .jpg / .jpeg em cada diretório que contém essas imagens. E mostrando o caminho completo do diretório.

Eu não sou nenhum especialista em bash, mas consegui juntar isso de várias partes que encontrei.

for i in $(tree -dfi --noreport); do
  find . \( -iname "*.jpg" -or -iname "*.jpeg" \) -type f -exec du -c {} \; $i
done

No entanto, estou recebendo um erro:

find: paths must precede expression

Alguém sabe o que eu fiz de errado?
Ou pode sugerir alguma alternativa com bash que possa fazer o que estou procurando?

Eu recebo o mesmo erro ao alterá-lo para isto:

for i in $(tree -dfi --noreport); do
  find $i \( -iname "*.jpg" -or -iname "*.jpeg" \) -type f -exec du {} \; $i
done
    
por batfastad 09.01.2013 / 17:15

2 respostas

2

for i in $(tree -dfi --noreport); do
    find $i -type f \( -iname "*.jpg" -or -iname "*.jpeg" \) -exec du {} \;
done

Solte o nome do caminho no final do comando find e a opção -type deve aparecer antes de qualquer outra opção para tornar a pesquisa um pouco mais rápida. Isso deve acontecer.

A propósito, para te ajudar um pouco, eu teria feito isso desta maneira:

for i in $( tree -dfi --noreport ); do 
    find $i -maxdepth 1 -type f \( -iname "*.jpg" -or -iname "*.jpeg" \) -exec du '{}' \; | awk -v d=$i '{ j+=$1; } END{ printf("%s: %d\n", d, j) }' | grep -Ev ": 0$"
done
    
por 10.01.2013 / 00:20
2

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
    
por 10.01.2013 / 01:27

Tags