Otimização de imagem com imageOptim usando o bash. Como obter um resumo

1

Estou usando o imageOptim para otimizar imagens no meu servidor.

Demorei algum tempo para aprender scripts bash rudimentares para otimizar todas as imagens em todos os meus diretórios de primeiro nível. Meu script parece da seguinte maneira e, do ponto de vista funcional, faz exatamente o que eu quero:

for dir in mydir/*/
do
    sudo jpegoptim --strip-all -t "$dir"*.jpg
done

O problema é com o ângulo estético. Quando executo o script, ele gera o seguinte:

mydir/dir_1/img_1.jpg axb 24bit N JFIF  [OK] 2234 --> 1861 bytes (16.70%), optimized.
...
mydir/dir_1/img_16.jpg axb 24bit N JFIF  [OK] 2234 --> 1861 bytes (16.70%), optimized.
Average compression (16 files): 7.26% (8k)
mydir/dir_2/img_1.jpg axb 24bit N JFIF  [OK] 2234 --> 1861 bytes (16.70%), optimized.
...
mydir/dir_2/img_6.jpg axb 24bit N JFIF  [OK] 2234 --> 1861 bytes (16.70%), optimized.
Average compression (6 files): 7.26% (8k)

Ele exibe a linha Average compression (6 files): 7.26% (8k) porque solicitei um resumo com o sinalizador ( -t ). Mas eu não quero obter todas as informações sobre cada recurso específico. Quando tento suprimi-lo com -t -q ou -tq ou -q -t (tentei todos eles porque não tenho certeza se é importante) ele não mostrou nenhuma informação.

No caso muito perfeito, eu só quero ver um número - quanto tamanho eu salvei. Porque este é o meu primeiro script bash (eu lutei por uma hora com esse loop :-() , minhas habilidades atualmente não são suficientes para resolver o meu problema.

    
por Salvador Dali 21.03.2014 / 07:55

2 respostas

1

Depois de melhorar minhas habilidades básicas de unix / bash, descobri o que acho ser uma maneira incrível de fazer isso. É tão simples que me surpreende que tenha perdido tanto tempo. Então aqui está o código:

du -s mydir/
for dir in mydir/*/
do
    sudo jpegoptim --strip-all -q "$dir"*.jpg
done
du -s mydir/

É isso que a diferença entre a primeira e a segunda saída me dará quanto espaço eu salvei em KB . du -s mydir/ me dirá o tamanho da pasta antes da otimização, a mesma no final - após a otimização.

Se eu fosse melhor no bash, seria capaz de salvar o primeiro em alguma variável, subtrair o segundo. Mas até isso é bom para mim.

    
por Salvador Dali 21.03.2014 / 11:27
3

Você pode experimentar este marcador usando find e perl :

sudo find . -type d -exec  sh -c "./jpegoptim --strip-all -t {}/*.jpg" \; | perl -e '@a=<>; $a=join("", @a); @b = $a =~ /%\s+\((\d+)k\)/g; foreach my $n (@b) {$sum = $sum + $n}; print "Total saved ${sum}k\n"'

Você precisa copiar jpegoptim no diretório onde você inicia o comando find , é claro.

Um loop bash não é realmente necessário, um find pode filtrar diretórios com -d type.

A parte perl apenas analisará "% ( o tamanho salvo por dir k)" e soma todos os valores antes de imprimir uma única linha com apenas a soma.

  • find . -type d apenas retorna os diretórios.
  • -exec <command> \; iniciará o comando fornecido para cada diretório
  • sh -c "" é necessário, pois precisamos de um shell para interpretar o curinga * .jpg.
  • a saída inteira é canalizada | para perl
  • perl primeiro crie um array com stdin (< & gt ;, o operador de diamante), @a.
  • Em seguida, juntou-se a uma string, $ a
  • @b = $a =~ /%\s+\((\d+)k\)/g colocará na matriz @b todas as sequências combinadas incluídas nas linhas de resumo de compactação média usando uma expressão regular
  • Finalmente, foreach my $n (@b) {$sum = $sum + $n} soma todos os valores das matrizes antes de imprimir o resultado
por Sylvain Pineau 21.03.2014 / 08:52