aboutsummaryrefslogtreecommitdiffstats
path: root/hyperterm/tools/rar2zip.sh
blob: d2ba15aae1cfe92b54fdf3ac14a802c3c65518e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/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."
}

rar2zip "$@"