#!/bin/bash # # rar2zip conversion script # # Usage: rar2zip file [file ...] # Example: rar2zip file.rar function check_and_install_7z() { if command -v 7z &>/dev/null; then return 0 fi install_package p7zip } function check_and_install_unar_unrar() { local unar_missing=0 local unrar_missing=0 command -v unar &>/dev/null || unar_missing=1 command -v unrar &>/dev/null || unrar_missing=1 case "$unar_missing$unrar_missing" in 00) # both installed return 0 ;; 10) # unar installed, unrar missing install_package unrar && return 0 ;; 01) # unrar installed, unar missing install_package unar && return 0 ;; 11) # both missing, try unar first, then unrar install_package unar && return 0 install_package unrar && return 0 echo "Error: could not install either unar or unrar." return 1 ;; esac } function extract_rar() { if command -v unar &>/dev/null; then unar "$1" -o "$2" elif command -v unrar &>/dev/null; then unrar x -o+ "$1" "$2" else echo "Error: neither unar nor unrar available to extract $1" return 1 fi } function rar2zip() { check_and_install_7z || { echo "Failed to install 7z. Aborting." exit 1 } check_and_install_unar_unrar || { echo "Failed to install unar or unrar. Aborting." exit 1 } echo "Converting RAR files to ZIP..." WORKDIR="/dev/shm" for INFILE in "$@"; do OLDFILE=$(realpath "$INFILE") BASENAME=$(basename "${OLDFILE%.*}") DIRNAME=$(dirname "$OLDFILE") NEWNAME="${DIRNAME}/${BASENAME}.zip" if [ ! -e "$NEWNAME" ]; then TEMPDIR=$(mktemp -p "$WORKDIR" -d) echo "Extracting $OLDFILE" extract_rar "$OLDFILE" "$TEMPDIR/" || { echo "Extraction failed for $OLDFILE" rm -rf "$TEMPDIR" continue } 7z a -tzip -mx=9 "$NEWNAME" "${TEMPDIR}/*" touch -r "$OLDFILE" "$NEWNAME" rm -rf "$TEMPDIR" gio trash "$OLDFILE" 2>/dev/null || rm -f "$OLDFILE" echo "$OLDFILE: Original file moved to trash" else echo "$NEWNAME: File already exists!" fi done echo "Conversion complete." }