Я использую imageOptim для оптимизации изображений на моем сервере.
Мне потребовалось некоторое время для изучения элементарных сценариев удара способному для оптимизации всех изображений во всех моих первых каталогах уровня. Мой сценарий смотрит следующий путь, и с функциональной точки зрения он делает точно, что я хочу:
for dir in mydir/*/
do
sudo jpegoptim --strip-all -t "$dir"*.jpg
done
Проблема с эстетическим углом. Когда я запускаю скрипт, он производит следующее:
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)
Это производит строку Average compression (6 files): 7.26% (8k)
потому что я попросил сводку с (-t
) флаг. Но я не хочу получать всю информацию о каждом конкретном ресурсе. Когда я пытаюсь подавить его с -t -q
или -tq
или -q -t
(Я судил их всех, потому что я не уверен это, это имеет значение), что это не показало информации вообще.
В очень идеальном случае я просто хочу видеть одно число - сколько размера сохранили меня. Поскольку это - мой первый сценарий удара (я боролся в течение часа с тем циклом :-(), мои навыки в настоящее время не достаточны для решения моей проблемы.
После часов улучшения моих основных навыков Unix/удара я нашел то, что я думаю, удивительный способ сделать это. Это столь просто, что я удивлен, что потратил впустую так много времени. Таким образом, вот код:
du -s mydir/
for dir in mydir/*/
do
sudo jpegoptim --strip-all -q "$dir"*.jpg
done
du -s mydir/
Вот именно различие между первым и вторым выводом даст мне, сколько свободного места я оставил в KB
. du -s mydir/
скажет мне размер папки перед оптимизацией, тем же в конце - после оптимизации.
, Если бы я был бы лучше в ударе, я был бы в состоянии сохранить первый в некоторой переменной, вычесть второе. Но даже это хорошо для меня.
Можно попробовать эту остроту с помощью find
и 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"'
необходимо скопировать jpegoptim
в каталоге, где Вы запускаете эти find
команда, конечно.
цикл удара А не действительно необходим, find
может отфильтровать каталоги с -d
тип.
perl
часть просто проанализирует для "% ( сохраненный размер на dir k)" и суммирует все значения прежде, чем распечатать одну строку только с суммой.
find . -type d
только возвраты каталоги. -exec <command> \;
запустится, данная команда для каждого каталога sh -c ""
требуется, поскольку нам нужна оболочка для интерпретации *.jpg подстановочного знака. |
к жемчугу @b = $a =~ /%\s+\((\d+)k\)/g
вставит массив @b все совпавшие строки, включенные в средние сводные строки сжатия с помощью регулярного выражения foreach my $n (@b) {$sum = $sum + $n}
сумма все значения массивов прежде, чем распечатать результат