--- tags: - maturity/🌱 date: 2023-11-20 zero-link: - "[[../../meta/zero/00 Π‘Π½ΠΈΠΏΠ΅Ρ‚Ρ‹ Π½Π° bash|00 Π‘Π½ΠΈΠΏΠ΅Ρ‚Ρ‹ Π½Π° bash]]" parents: linked: --- Π Π°Π·ΠΌΠ΅Ρ€ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ составляСт ΡΡƒΡ‰Π΅ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° страницы сайта. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ часто я сТимаю изобраТСния Π½Π° своих сайтах. Π’ этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽ ΠΊΠ°ΠΊΠΈΠΌΠΈ способами я это дСлаю. ```shell #!/bin/bash file=comp.flag if [ -f "$file" ]; then option="-newer $file" fi find ./images/ -type f -not -path "./images/comp/*" ! -name "*-no-comp.*" $option -iname "*.png" -exec sh -c ' png_file="${1/\/images\//\/images\/comp\/}" png_dir="$(dirname "$png_file")" mkdir -p "$png_dir" cp "$1" "${png_file}" optipng -o7 "${png_file}" advpng -z4 "${png_file}" pngcrush -rem gAMA -rem alla -rem cHRM -rem iCCP -rem sRGB -rem time -ow "${png_file}" ' _ {} \; find ./images/ -type f-not -path "./images/comp/*" ! -name "*-no-comp.*" $option -iregex '.*\.\(jpg\|jpeg\)' -exec sh -c ' jpg_file="${1/\/images\//\/images\/comp\/}" jpg_dir="$(dirname "$jpg_file")" mkdir -p "$jpg_dir" cp "$1" "${jpg_file}" jpegoptim --all-progressive "${jpg_file}" ' _ {} \; touch $file echo "$(date)" > $file ``` Π­Ρ‚ΠΎΡ‚ скрипт сТимаСт изобраТСния Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ качСства. Он размСщаСтся рядом с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌΒ `images`, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находятся ваши изобраТСния. РазбСрСмся, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π‘Π½Π°Ρ‡Π°Π»Π° скрипт провСряСт, сущСствуСт Π»ΠΈ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ„Π°ΠΉΠ»Β `comp.flag`. Если Ρ„Π°ΠΉΠ» сущСствуСт, ΠΎΠ½ устанавливаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β `-newer $file`Β Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽΒ `option`, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° для поиска Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ послС Π΄Π°Ρ‚Ρ‹ создания Ρ„Π°ΠΉΠ»Π°Β `optimg.flag`. Если Ρ„Π°ΠΉΠ» Π½Π΅ сущСствуСт, пСрСмСнная `option`Β Π±ΡƒΠ΄Π΅Ρ‚ пустой. Π—Π°Ρ‚Π΅ΠΌ скрипт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΡƒΒ `find` для рСкурсивного поиска Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅Β `images`Β ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅: - `-type f`. Π―Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. - Π˜ΠΌΠ΅ΡŽΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°Β `.png`,Β `.jpeg`Β ΠΈΠ»ΠΈΒ `.jpg`. - `-not -path`_._ НС находятся Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…_._Β Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС это ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈΒ `./images/comp`. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΡƒΠ΄Π° сТатыС изобраТСния, ΠΈ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΠΎ Π½ΠΈΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ поиском ΠΈ ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒ снова. - `! -name "-no-comp."`. ΠžΡΡ‚Π°Π²ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ссли Π΅Π³ΠΎ имя заканчиваСтся Π½Π°Β `-no-comp`. - Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· этих Ρ„Π°ΠΉΠ»ΠΎΠ² сцСнарий ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свою ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Ρ‚ΠΈΡ€Π°Ρ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ВмСсто этого ΠΌΡ‹ создадим Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒΒ `comp`Β Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅Β `images`, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈ слоТим ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ изобраТСния. БоздаваСмая структура ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π²Β `comp`Β Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ структуру ΠΏΠΎΠ΄ΠΊΠ°Ρ‚ΠΎΠ»ΠΎΠ³ΠΎΠ² Π²Β `images`. Для Ρ„Π°ΠΉΠ»ΠΎΠ² PNG сначала ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡΒ `optipng` для сТатия с самым высоким ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ (`-o7`). Π”Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΒ `advpng` для дальнСйшСго сТатия с ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ сТатия 4 (`-z4`). И Π½Π°ΠΊΠΎΠ½Π΅Ρ†Β `pngcrush` для удалСния ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ бСзопасно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π°. Для Ρ„Π°ΠΉΠ»ΠΎΠ² JPEG ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡΒ `jpegoptim` для ΠΈΡ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ со сТатиСм Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ (`--all-progressive --strip-all`). ПослС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ всСх подходящих ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ сцСнарий пСрСсоздаСт Ρ„Π°ΠΉΠ»Β `comp.flag`. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ скрипт Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° послСднСго запуска. ## ВСсты Π½Π° сТатиС Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Π΄Π²Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… изобраТСния (3456β€Š x β€Š2234): ΠΎΠ΄Π½ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ jpg ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 2.2 ΠΌΠ±, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ png ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 2,7 ΠΌΠ±. ЗапускаСм скрипт ΠΈ смотрим Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сТатия. ```bash ** Processing: ./images/comp/image-two.png 3456x2234 pixels, 4x8 bits/pixel, RGB+alpha Input IDAT size = 2664231 bytes Input file size = 2666952 bytes Trying: zc = 9 zm = 9 zs = 0 f = 0 IDAT size = 2374591 zc = 9 zm = 8 zs = 0 f = 0 IDAT size = 2368803 zc = 9 zm = 9 zs = 0 f = 1 IDAT size = 2142264 zc = 9 zm = 8 zs = 0 f = 1 IDAT size = 2137390 zc = 9 zm = 9 zs = 1 f = 1 IDAT size = 2134232 zc = 9 zm = 8 zs = 1 f = 1 IDAT size = 2128765 zc = 9 zm = 9 zs = 0 f = 4 IDAT size = 2074935 zc = 9 zm = 8 zs = 0 f = 4 IDAT size = 2071117 zc = 9 zm = 9 zs = 1 f = 4 IDAT size = 2055799 zc = 9 zm = 8 zs = 1 f = 4 IDAT size = 2054390 zc = 9 zm = 9 zs = 0 f = 5 IDAT size = 2046026 zc = 9 zm = 8 zs = 0 f = 5 IDAT size = 2040193 zc = 9 zm = 9 zs = 1 f = 5 IDAT size = 2031130 zc = 9 zm = 8 zs = 1 f = 5 IDAT size = 2024568 Selecting parameters: zc = 9 zm = 8 zs = 1 f = 5 IDAT size = 2024568 Output IDAT size = 2024568 bytes (639663 bytes decrease) Output file size = 2025345 bytes (641607 bytes = 24.06% decrease) 2025345 2025345 100% ./images/comp/image-two.png (Bigger 2208631) 2025345 2025345 100% Warning: versions are different between png.h and png.c png.h version: 1.6.34 png.c version: 1.6.37 Recompressing IDAT chunks in ./images/comp/image-two.png Total length of data found in critical chunks = 2024625 Best pngcrush method = 10 (ws 15 fm 6 zl 9 zs 1) = 2055326 CPU time decode 1.074758, encode 16.759768, other 0.018592, total 17.899076 sec ./images/comp/image-one.jpg 3456x2234 24bit N Exif XMP JFIF [OK] 2158567 --> 1947377 bytes (9.78%), optimized. ``` Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ смогли ΡΠΆΠ°Ρ‚ΡŒ png Π΄ΠΎ 2.1 ΠΌΠ±, Π° jpg Π΄ΠΎ 1.9 ΠΌΠ±. ΠŸΡ€ΠΈ этом сохранив исходный Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния ΠΈ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ качСства. > [!NOTE] > Π›ΡƒΡ‡ΡˆΠ΅Π΅, Π½Π° ΠΌΠΎΠΉ взгляд, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для сТатия jpg это JPEGmini Pro. Π˜ΠΌΠ΅Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ cli для сСрвСров. Но ΠΊ соТалСнию ΠΎΠ½ΠΎ ΠΏΠ»Π°Ρ‚Π½ΠΎΠ΅. Π•Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сТатия 2.2 ΠΌΠ± β€”> 959 ΠΊΠ±. ## Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ - [ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Webp](ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅%20ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ%20Π²%20Webp.md)