86 lines
2.1 KiB
Bash
Executable File
86 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# zip_images_resize Resizing large JPGs in ZIPs
|
|
# Based on: https://shkspr.mobi/blog/2016/12/converting-rar-to-zip-in-linux/
|
|
#
|
|
# Usage: xxx.sh file [file ...]
|
|
|
|
echo "Resizing large JPGs in ZIPs"
|
|
|
|
# Use RAM disk for temporary files.
|
|
WORKDIR="/dev/shm/"
|
|
|
|
# Cleanup function
|
|
cleanup_temp() {
|
|
if [ -n "$TEMPDIR" ] && [ -d "$TEMPDIR" ]; then
|
|
rm -r "$TEMPDIR"
|
|
fi
|
|
}
|
|
|
|
for INFILE in "$@"; do
|
|
# Absolute path to old file
|
|
#OLDFILE=$(realpath "${INFILE}")
|
|
OUTFILE="${INFILE%.zip}-compress.zip"
|
|
|
|
# Remove output file if it already exists
|
|
if [ -e "${OUTFILE}" ]; then
|
|
rm "${OUTFILE}"
|
|
fi
|
|
|
|
# Set name for the temp dir. This directory will be created under WORKDIR
|
|
TEMPDIR=$(mktemp -p "$WORKDIR" -d)
|
|
|
|
# Set up cleanup trap
|
|
trap cleanup_temp EXIT INT TERM
|
|
|
|
# Create a temporary folder for unzipped files
|
|
echo "Extracting $INFILE"
|
|
|
|
# extract files from zip
|
|
if ! unzip "$INFILE" -d "$TEMPDIR"; then
|
|
echo "Error: Failed to extract $INFILE"
|
|
cleanup_temp
|
|
continue
|
|
fi
|
|
|
|
# resize
|
|
#convert '${TEMPDIR}/*.jpg' -set filename:fn '%[basename]' -resize 2800000@@\> -sampling-factor 4:2:0 -strip -quality 85% -colorspace RGB '%[filename:fn].jpg'
|
|
|
|
if ! pushd "$TEMPDIR" > /dev/null; then
|
|
echo "Error: Failed to change to temp directory"
|
|
cleanup_temp
|
|
continue
|
|
fi
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
"$SCRIPT_DIR/images_resize.sh"
|
|
popd > /dev/null
|
|
|
|
# Zip the files with no compression
|
|
pushd "$TEMPDIR" > /dev/null
|
|
if ! 7z a -tzip -mx=0 "$OUTFILE" ./*; then
|
|
echo "Error: Failed to create ZIP"
|
|
popd > /dev/null
|
|
cleanup_temp
|
|
continue
|
|
fi
|
|
popd > /dev/null
|
|
|
|
# Alternative. MUCH SLOWER, but better compression
|
|
# 7z a -mm=Deflate -mfb=258 -mpass=15 -r "$NEWNAME" *
|
|
|
|
# Preserve file modification time
|
|
touch -r "$INFILE" "$OUTFILE"
|
|
rm "$INFILE"
|
|
mv "$OUTFILE" "$INFILE"
|
|
|
|
# Delete the temporary directory
|
|
cleanup_temp
|
|
trap - EXIT INT TERM
|
|
|
|
# OPTIONAL. Safe-remove the old file
|
|
#gio trash "$OLDFILE"
|
|
|
|
done
|
|
|
|
echo "Conversion Done"
|