Компрессия всех картинок на сервере

Тему в разделе "За чашкой кофе", создал(-а) KarDer, 24.04.2014.

  1. KarDer

    KarDer Новичок

    Хоть на сервере и есть код оптимизации картинок при загрузки, но гугл постоянно ругается что не достаточно сжаты картинки, а их на сервере уже сотни тысяч. Хочу поставить в cron скрипт который бы разок в пару месяцев дооптимизировал все картинки загруженные.

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

    Вот что я накопал и что сделал:
    - сжимаю методом из библиотеки libjpeg
    - создал файл jpegtran.sh, и вписал в него:
    Код:
    #!/bin/bash
    
    for i in *;
      do jpegtran -optimize -progressive -copy all -outfile "$i" "$i";
      done
    
    - бросаю этот файл в папку с картинками и запускаю sh ./jpegtran.sh

    Затык собственно в:
    - как сделать чтобы файл положить в корневой каталог и заставить пройти все папки рекурсивно? (а не как сейчас, в ручную кидать в каждую папку и оттуда запускать.)

    Если кто-то уже подобное делал, то поделитесь, или же знает более лучший способ.
     
  2. KarDer

    KarDer Новичок

    Так, вот к чему я пришел:
    find . \( -iname "*.jpeg" -o -iname "*.jpg" \) -print -execdir jpegtran -perfect -copy all -progressive -optimize -outfile temp.jpeg '{}' \; -execdir mv temp.jpeg '{}' \; | awk '{sum++}; END { print sum}' >> ~/logs/log_compressing_jpeg_file.log

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

    Для именования датой логфайлов, я использую подобную конструкцию: $(date +\%d-\%m-\%Y), вот только сюда не выходит всунуть, с синтаксисом ошибка, подскажите как её сюда впихнуть?
     
  3. Egor L.

    Egor L. Moderator Команда форума

    Можно добавить переменную с желаемой формой даты. Например, в формате, как и у вас,

    Код:
    date=`date "+%d-%m-%Y"`
    Но если будете выполнять рекурсивно, время необходимо обновлять при каждом проходе, т.е. выполнять вместе с циклом. Можно через

    Код:
    echo -n $date > /logs/log_compressing_jpeg_file.log 
    вписывать ее в лог, но можно сразу при выполнении в лог через >>. Но нужно посмотреть, скорее всего будет переход на новую строку.
     
  4. KarDer

    KarDer Новичок

    Большое спасибо за направление.

    Вот мой финальный вариант:
    Код:
    date_now=`date "+%d-%m-%Y"`; echo -n $date_now >> ~/logs/log_compressing_jpeg_file.log; find . \( -iname "*.jpeg" -o -iname "*.jpg" \) -print -execdir jpegtran -perfect -copy all -progressive -optimize -outfile temp.jpeg '{}' \; -execdir mv temp.jpeg '{}' \; | awk '{ sum++ }; END { print " count: " sum }' >> ~/logs/log_compressing_jpeg_file.log
    Вот что в лог падает:
    Код:
    27-04-2014 count: 194
    Если кому-то интересно в целом смысл этой моей работы, так вот, на тестовом сервере было 42Гб папка с медиа файлами, после прогона этой командой, данная папка уменьшилась до 39Гб. На продакшине еще больше файлов, так что эффект будет еще больше. (Это было предпринято не для экономии места на винте, а для экономии трафика и уменьшение веса страницы)

    Что на будущее еще хотелось бы сюда допилить:
    • засекать время выполнения, так как на сервере более полумиллиона файлов и их перебор занимает довольно не мало времени
    • попробовать научить трогать файлы только еще не сжатые (так же для экономии времени)
    • сжатие png файлов
     

Поделиться этой страницей