Существует ли команда Linux для массовой оптимизации нескольких файлов изображений всего за один шаг?

Существует ли команда Linux для массовой оптимизации нескольких файлов изображений всего за один шаг?

У меня есть куча изображений в папке:

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

Эти изображения не оптимизированы для Интернета.

Просто интересно, есть ли команда Linux для массовой оптимизации этих изображений всего за один шаг?

ОБНОВЛЯТЬ: Мне нужно сделать две вещи для каждого изображения:

  1. если ширина изображения больше 900 пикселей, то уменьшите ширину до 900 пикселей (сохраняя пропорции)

  2. сохраните файл с более низким качеством, скажем, 70% от оригинала.

решение1

УстановитьImageMagick:

sudo apt-get install imagemagick

И используйте convertкоманду следующим образом:

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

решение2

Если у вас много файлов и вы хотите сделать это быстро, вы также можете воспользоваться параллельной программой:

sudo apt install imagemagick parallel

И далее следующее:

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]"'

Давайте разберемся:

  • find-- искать файлы
    • .-- в текущем каталоге
    • \( -name '*.jp*g' -o -name '*.png' \)-- которые являются файлами формата png или jpeg (оба расширения — «jpg» и «jpeg» — являются распространенными!)
    • -a ! -name '*.min.*'-- и пропускать файлы, которые уже свернуты
    • -type f-- и являются реальными файлами, а не символическими ссылками или странно названными каталогами
    • -print0-- вывести эти файлы, разделив их нулевым байтом (чтобы пробелы не мешали работе)
  • parallel-- прочитать предыдущую команду и выполнить эту команду параллельно для каждого элемента
    • -0-- каждый элемент отделен нулевым байтом
    • convert {}-- вызовите программу imagemagick "convert", заменив имя файла на{}
      • resize '>900x' -quality '70%'-- измените размер изображения до максимального значения 900 пикселей по оси x и измените качество jpeg до 70%.Естьмногодругие возможные варианты здесь.
      • -set filename:newname "%d/%[basename].min.%[extension]"-- создайте переменную с новым именем файла.Все допустимые значения см. в документации..
        • %d-- каталог, в котором находится файл
        • %[basename]-- имя файла без каких-либо расширений
        • %[extension]-- исходное расширение файла
      • "%[filename:newname]"-- имя выходного файла, которое мы настроили на предыдущем шаге

Связанный контент