Files
2025-11-27 04:22:46 +00:00

82 lines
2.0 KiB
Bash
Executable File

#!/bin/bash
#
# rar2zip conversion script
# Based on: https://shkspr.mobi/blog/2016/12/converting-rar-to-zip-in-linux/
#
# Usage: rar2zip.sh file [file ...]
if [ $# -eq 0 ]; then
echo "Usage: $0 file.rar [file2.rar ...]"
exit 1
fi
echo "Converting RARs to 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}")
# Get the file name without the extension
BASENAME=$(basename "${OLDFILE%.*}")
# Path for the file. The ".zip" file will be written there.
DIRNAME=$(dirname "$OLDFILE")
# Name of the .zip file
NEWNAME="${DIRNAME}/$BASENAME.zip"
if [ ! -e "${NEWNAME}" ]; then
# 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 unRARed files
echo "Extracting $OLDFILE"
if ! rar x "$OLDFILE" "${TEMPDIR}/"; then
echo "Error: Failed to extract $OLDFILE"
cleanup_temp
continue
fi
# Zip the files with maximum compression
pushd "$TEMPDIR" > /dev/null
if ! 7z a -tzip -mx=9 "$NEWNAME" ./*; then
echo "Error: Failed to create ZIP for $BASENAME"
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 "$OLDFILE" "$NEWNAME"
# Delete the temporary directory
cleanup_temp
trap - EXIT INT TERM
# OPTIONAL. Safe-remove the old file
#gio trash "$OLDFILE"
else
echo "${NEWNAME}: File exists!"
fi
done
echo "Conversion Done"