Existe um comando do Linux para otimizar em massa vários arquivos de imagem em apenas uma etapa?

Existe um comando do Linux para otimizar em massa vários arquivos de imagem em apenas uma etapa?

Eu tenho um monte de imagens em uma pasta:

images/image1.jpg
images/image2.jpg
...

Essas imagens não são otimizadas para a web.

Gostaria de saber se existe um comando Linux para otimizar em massa essas imagens em apenas uma etapa?

ATUALIZAR: preciso fazer duas coisas para cada imagem:

  1. se a largura da imagem for superior a 900px, reduza a largura para 900px (mantendo as proporções)

  2. salve o arquivo com qualidade inferior, digamos 70% do original.

Responder1

InstalarImagemMagick:

sudo apt-get install imagemagick

E use o convertcomando da seguinte forma:

mkdir new
for file in images/*jpg
do convert -quality 70% -resize '>900x' "$file" new/$(basename "$file")
done

Responder2

Se você tiver muitos arquivos e quiser fazer isso rapidamente, também poderá usar o programa paralelo:

sudo apt install imagemagick parallel

E então o seguinte:

find . \( -name '*.jp*g' -o -name '*.png' \) -a ! -name '*.min.*' -type f -print0 | \
parallel -0 'convert {} -resize '>900x' -quality '70%' \
    -set filename:newname "%d/%[basename].min.%[extension]" "%[filename:newname]"'

Vamos examinar isso:

  • find-- procure por arquivos
    • .-- no diretório atual
    • \( -name '*.jp*g' -o -name '*.png' \)- que são png ou jpeg (ambos "jpg" e "jpeg" são extensões comuns!)
    • -a ! -name '*.min.*'-- e pular arquivos que já estão minimizados
    • -type f-- e são arquivos reais, não links simbólicos ou diretórios com nomes estranhos
    • -print0-- imprime esses arquivos separados pelo byte nulo (para que os espaços não quebrem as coisas)
  • parallel-- leia o comando anterior e execute este comando em paralelo para cada elemento
    • -0-- cada elemento é separado pelo byte nulo
    • convert {}-- chame o programa imagemagick "convert" com o nome do arquivo substituído por{}
      • resize '>900x' -quality '70%'-- redimensione a imagem para um máximo de 900px no eixo x e altere a qualidade jpeg para 70%.muitosoutras opções possíveis aqui.
      • -set filename:newname "%d/%[basename].min.%[extension]"-- crie uma variável com o novo nome de arquivo.Veja a documentação para todos os valores válidos.
        • %d-- o diretório onde o arquivo está
        • %[basename]-- o nome do arquivo sem extensões
        • %[extension]-- a extensão original do arquivo
      • "%[filename:newname]"-- o nome do arquivo de saída que configuramos na etapa anterior

informação relacionada