#!/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"