рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдЕрдиреБрдХреВрд▓рди

рдХрд┐рд╕реА рднреА рд╕рд╛рдЗрдЯ рдХреА рдбрд╛рдЙрдирд▓реЛрдб рдЧрддрд┐ рдХрд╛рдлреА рд╣рдж рддрдХ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдФрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд╡реЗрдм рд╕реЗрд╡рд╛рдПрдБ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрдВ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:


рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЗ рдмреАрдЪ рд░реИрдВрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЫрд╡рд┐ рдЕрдиреБрдХреВрд▓рди рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдкреНрд░рддреНрдпреЗрдХ рдкреАрдПрдирдЬреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП, рдСрдкреНрдЯрд┐рдкрдВрдЧ рдФрд░ рдкреАрдВрдЧрдХреНрд░рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдФрд░ jpg рдХреЗ рд▓рд┐рдП - jpegtran ред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП Optipng рдЖрдЬрд╝рдорд╛рдПрдБ:



рдиреЛрдЯ: -o7 рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде, рдСрдкреНрдЯрд┐рдкрдВрдЧ рд╕рдмрд╕реЗ рдзреАрдореА рдореЛрдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рддреНрд╡рд░рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП -o0ред

рдлрд┐рд░ рдореВрдВрдЧрдлрд▓реА:



JPGtran рдХреЗ рд╕рд╛рде JPG рдЕрдиреБрдХреВрд▓рди:



рдкрдЯрдХрдерд╛ рд▓реЗрдЦрди


рддреИрдпрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ GitHub рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдиреАрдЪреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рдЫреЛрдЯреЗ рдФрд░ рдкреВрд░реНрдг рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЪрд░:

SHORTOPTS="h,i:,o:,q,s" LONGOPTS="help,input:,output:,quiet,no-stats" 

рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрдЯреЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдпрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реВрдк:

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
 ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@") eval set -- "$ARGS" while true; do case $1 in -h|--help) usage exit 0 ;; -i|--input) shift INPUT=$1 ;; -o|--output) shift OUTPUT=$1 ;; -q|--quiet) QUIET='1' ;; -s|--no-stats) NOSTATS='1' ;; --) shift break ;; *) shift break ;; esac shift done 


рдорджрдж


рд╣рдо рджреЛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:


рдЙрдиреНрд╣реЗрдВ рдЪрдХреНрд░ рд╕реЗ рдкрд╣рд▓реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
 PROGNAME=${0##*/} usage() { cat <<EO Usage: $PROGNAME [options] Script to optimize JPG and PNG images in a directory. Options: EO cat <<EO | column -s\& -t -h, --help & shows this help -q, --quiet & disables output -i, --input [dir] & specify input directory (current directory by default) -o, --output [dir] & specify output directory ("output" by default) -ns, --no-stats & no stats at the end EO } SHORTOPTS="h,i:,o:,q,s" LONGOPTS="help,input:,output:,quiet,no-stats" ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@") 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХреНрдпрд╛ рд╣реБрдЖред



рдиреЛрдЯ: рдпрджрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕реЗ "./optimize.sh: рдкрдВрдХреНрддрд┐ 2: $ '\ r': рдХрдорд╛рдВрдб рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ", рддреЛ рдЖрдкрдХреЛ рд╕рдмрд▓реЗрдо рдЯреЗрдХреНрд╕реНрдЯ 2 рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреЛрд▓рдиреЗ рдФрд░ рд╡реНрдпреВ> рд▓рд╛рдЗрди рдПрдВрдбрд┐рдВрдЧ> рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдпреВрдирд┐рдХреНрд╕ рдореЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЦреНрдп рдХрд╛рд░реНрдп (рдореБрдЦреНрдп)


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
 main() { # If $INPUT is empty, then we use current directory if [[ "$INPUT" == "" ]]; then INPUT=$(pwd) fi # If $OUTPUT is empty, then we use the directory "output" in the current directory if [[ "$OUTPUT" == "" ]]; then OUTPUT=$(pwd)/output fi # We create the output directory mkdir -p $OUTPUT # To avoid some troubles with filename with spaces, we store the current IFS (Internal File Separator)... SAVEIFS=$IFS # ...and we set a new one IFS=$(echo -en "\n\b") max_filelength=`get_max_file_length` pad=$(printf '%0.1s' "."{1..600}) sDone=' [ DONE ]' linelength=$(expr $max_filelength + ${#sDone} + 5) # Search of all jpg/jpeg/png in $INPUT # We remove images from $OUTPUT if $OUTPUT is a subdirectory of $INPUT IMAGES=$(find $INPUT -regextype posix-extended -regex '.*\.(jpg|jpeg|png)' | grep -v $OUTPUT) if [ "$QUIET" == "0" ]; then echo --- Optimizing $INPUT --- echo fi for CURRENT_IMAGE in $IMAGES; do filename=$(basename $CURRENT_IMAGE) if [ "$QUIET" == "0" ]; then printf '%s ' "$filename" printf '%*.*s' 0 $((linelength - ${#filename} - ${#sDone} )) "$pad" fi optimize_image $CURRENT_IMAGE $OUTPUT/$filename if [ "$QUIET" == "0" ]; then printf '%s\n' "$sDone" fi done # we restore the saved IFS IFS=$SAVEIFS if [ "$NOSTATS" == "0" -a "$QUIET" == "0" ]; then echo echo "Input: " $(human_readable_filesize $max_input_size) echo "Output: " $(human_readable_filesize $max_output_size) space_saved=$(expr $max_input_size - $max_output_size) echo "Space save: " $(human_readable_filesize $space_saved) fi } 

рдЖрдкрдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ mkdir рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдирд╛рдо рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо IFS (рдЖрдВрддрд░рд┐рдХ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рднрд╛рдЬрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝_рдЗрдореЗрдЬ рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ - рд╕реНрд░реЛрдд рдФрд░ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдПред

optimize_image:

 # $1: input image # $2: output image optimize_image() { input_file_size=$(stat -c%s "$1") max_input_size=$(expr $max_input_size + $input_file_size) if [ "${1##*.}" = "png" ]; then optipng -o1 -clobber -quiet $1 -out $2 pngcrush -q -rem alla -reduce $1 $2 >/dev/null fi if [ "${1##*.}" = "jpg" -o "${1##*.}" = "jpeg" ]; then jpegtran -copy none -progressive $1 > $2 fi output_file_size=$(stat -c%s "$2") max_output_size=$(expr $max_output_size + $output_file_size) } 


рдЖрдЙрдЯрдкреБрдЯ рдЬрд╛рдирдХрд╛рд░реА


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣:

 file1 ...................... [ DONE ] file2 ...................... [ DONE ] file_with_a_long_name ...... [ DONE ] ... 

рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
  2. рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рдбреЙрдЯреНрд╕ рд╕реЗ рдмрджрд▓реЗрдВ
  3. рдирд╛рдо рдФрд░ рдкрд╛рда рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ "[рд╕рдВрдкрдиреНрди]"

рдирддреАрдЬрддрди, рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рдЕрдВрдХ рдФрд░ рдкреВрд░реНрдг рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
 max_filelength=`get_max_file_length` pad=$(printf '%0.1s' "."{1..600}) sDone=' [ DONE ]' linelength=$(expr $max_filelength + ${#sDone} + 5) # Search of all jpg/jpeg/png in $INPUT # We remove images from $OUTPUT if $OUTPUT is a subdirectory of $INPUT IMAGES=$(find $INPUT -regextype posix-extended -regex '.*\.(jpg|jpeg|png)' | grep -v $OUTPUT) if [ "$QUIET" == "0" ]; then echo --- Optimizing $INPUT --- echo fi for CURRENT_IMAGE in $IMAGES; do filename=$(basename $CURRENT_IMAGE) if [ "$QUIET" == "0" ]; then printf '%s ' "$filename" printf '%*.*s' 0 $((linelength - ${#filename} - ${#sDone} )) "$pad" fi optimize_image $CURRENT_IMAGE $OUTPUT/$filename if [ "$QUIET" == "0" ]; then printf '%s\n' "$sDone" fi done 

рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

 # All parameters to default ./optimize.sh # Or with custom options ./optimize.sh --input images --output optimized-images # Or with custom options and shorthand ./optimize.sh -i images -o optimized-images 



рдЖрдВрдХрдбрд╝реЗ


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, input_file_size рдФрд░ output_file_size рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдореВрд▓ рдФрд░ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдЖрдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, human_readable_filesize () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБ рдФрд░ рдЖрдБрдХрдбрд╝реЗ рджреЗрдЦреЗрдВ:



рдпрд╣ рдХреЗрд╡рд▓ рдЕрдиреБрдХреВрд▓рди рдкреНрд░рджрд░реНрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:

 if [ "$QUIET" == "0" ]; then echo --- Optimizing $INPUT --- echo fi for CURRENT_IMAGE in $IMAGES; do filename=$(basename $CURRENT_IMAGE) if [ "$QUIET" == "0" ]; then printf '%s ' "$filename" printf '%*.*s' 0 $((linelength - ${#filename} - ${#sDone} )) "$pad" fi optimize_image $CURRENT_IMAGE $OUTPUT/$filename if [ "$QUIET" == "0" ]; then printf '%s\n' "$sDone" fi done 

рд╡рд╣ рд╕рдм рд╣реИ! рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред Github рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред

Source: https://habr.com/ru/post/In154683/


All Articles