рдХрд┐рд╕реА рднреА рд╕рд╛рдЗрдЯ рдХреА рдбрд╛рдЙрдирд▓реЛрдб рдЧрддрд┐ рдХрд╛рдлреА рд╣рдж рддрдХ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдФрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд╡реЗрдм рд╕реЗрд╡рд╛рдПрдБ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрдВ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
- рдмрд╣реБрдд рд╕рд╛рд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ
- рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдард┐рди рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ
рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЗ рдмреАрдЪ рд░реИрдВрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЫрд╡рд┐ рдЕрдиреБрдХреВрд▓рди рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдкреНрд░рддреНрдпреЗрдХ рдкреАрдПрдирдЬреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП,
рдСрдкреНрдЯрд┐рдкрдВрдЧ рдФрд░
рдкреАрдВрдЧрдХреНрд░рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдФрд░ jpg рдХреЗ рд▓рд┐рдП -
jpegtran ред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП Optipng рдЖрдЬрд╝рдорд╛рдПрдБ:
рдиреЛрдЯ: -o7 рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде, рдСрдкреНрдЯрд┐рдкрдВрдЧ рд╕рдмрд╕реЗ рдзреАрдореА рдореЛрдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рддреНрд╡рд░рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП -o0редрдлрд┐рд░ рдореВрдВрдЧрдлрд▓реА:

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

рдкрдЯрдХрдерд╛ рд▓реЗрдЦрди
рддреИрдпрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдХреЛ GitHub рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдиреАрдЪреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рд╕реНрд░реЛрдд рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд▓рд┐рдП -i рдпрд╛ --input
- рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд▓рд┐рдП -o рдпрд╛ --output
- рд░рди-рдЯрд╛рдЗрдо рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -q рдпрд╛ --quiet
- -s рдпрд╛ --no- рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- -h рдпрд╛ --help to call help
рдЫреЛрдЯреЗ рдФрд░ рдкреВрд░реНрдг рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЪрд░:
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 рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреЛрд▓рдиреЗ рдФрд░ рд╡реНрдпреВ> рд▓рд╛рдЗрди рдПрдВрдбрд┐рдВрдЧ> рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдпреВрдирд┐рдХреНрд╕ рдореЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдореБрдЦреНрдп рдХрд╛рд░реНрдп (рдореБрдЦреНрдп)
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдЖрдкрдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ mkdir рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдирд╛рдо рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо IFS (рдЖрдВрддрд░рд┐рдХ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рднрд╛рдЬрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝_рдЗрдореЗрдЬ рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ - рд╕реНрд░реЛрдд рдФрд░ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдПред
optimize_image:
рдЖрдЙрдЯрдкреБрдЯ рдЬрд╛рдирдХрд╛рд░реА
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣:
file1 ...................... [ DONE ] file2 ...................... [ DONE ] file_with_a_long_name ...... [ DONE ] ...
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
- рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рдбреЙрдЯреНрд╕ рд╕реЗ рдмрджрд▓реЗрдВ
- рдирд╛рдо рдФрд░ рдкрд╛рда рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ "[рд╕рдВрдкрдиреНрди]"
рдирддреАрдЬрддрди, рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо, рдЕрдВрдХ рдФрд░ рдкреВрд░реНрдг рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб max_filelength=`get_max_file_length` pad=$(printf '%0.1s' "."{1..600}) sDone=' [ DONE ]' linelength=$(expr $max_filelength + ${#sDone} + 5)
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

рдЖрдВрдХрдбрд╝реЗ
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 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 рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ред