#!/usr/bin/env bash set -e # COLOURS red='\033[1;31m' green='\033[1;32m' blue='\033[1;34m' yellow='\033[1;33m' nc='\033[0m' # USAGE GUIDE # displays the help menu if arguments are missing or incorrect show_help() { printf "${blue}usage:${nc} archivectl \n\n" printf "commands:\n" printf " compress [output] compresses a file or directory\n" printf " extract extracts a supported archive\n\n" printf "examples:\n" printf " archivectl compress myfolder\n" printf " archivectl compress myfolder data.zip\n" printf " archivectl extract data.tar.gz\n" exit 1 } # COMPRESSION ROUTINE # handles the creation of new archives do_compress() { if [ -z "$1" ]; then printf "${red}error: target missing for compression.${nc}\n" exit 1 fi local source_path="${1%/}" if [ ! -e "$source_path" ]; then printf "${red}error: source '%s' not found.${nc}\n" "$source_path" exit 1 fi local output if [ -n "$2" ]; then output="$2" else output="${source_path}.tar.gz" fi printf "${blue}compressing ${yellow}%s${nc} into ${yellow}%s${nc}...\n" "$source_path" "$output" case "$output" in *.tar.gz | *.tgz) tar -czf "$output" "$source_path" ;; *.tar.xz) tar -cJf "$output" "$source_path" ;; *.tar.bz2) tar -cjf "$output" "$source_path" ;; *.tar) tar -cf "$output" "$source_path" ;; *.zip) zip -r "$output" "$source_path" ;; *.7z) 7z a "$output" "$source_path" ;; *.rar) rar a "$output" "$source_path" ;; *) printf "${red}error: format not recognised.${nc}\n" exit 1 ;; esac printf "${green}compression complete.${nc}\n" du -h "$output" | awk '{print $1 " " $2}' } # EXTRACTION ROUTINE # handles the unpacking of existing archives do_extract() { if [ -z "$1" ]; then printf "${red}error: target missing for extraction.${nc}\n" exit 1 fi local file="$1" if [ ! -f "$file" ]; then printf "${red}error: file '%s' not found.${nc}\n" "$file" exit 1 fi printf "${blue}extracting: ${yellow}%s${nc}...\n" "$file" case "$file" in *.tar.bz2 | *.tbz2) tar xjf "$file" ;; *.tar.gz | *.tgz) tar xzf "$file" ;; *.tar.xz) tar xJf "$file" ;; *.tar) tar xf "$file" ;; *.lzma) unlzma "$file" ;; *.bz2) bunzip2 "$file" ;; *.rar) unrar x "$file" ;; *.gz) gunzip "$file" ;; *.zip) unzip "$file" ;; *.Z) uncompress "$file" ;; *.7z) 7z x "$file" ;; *.xz) unxz "$file" ;; *.exe) cabextract "$file" ;; *) printf "${red}error: format not recognised.${nc}\n" exit 1 ;; esac printf "${green}extraction complete.${nc}\n" } # COMMAND ROUTER # parses the first argument to determine execution path case "$1" in compress) do_compress "$2" "$3" ;; extract) do_extract "$2" ;; *) show_help ;; esac