{ ... }: { text = '' export _unpack_supported=".tar$|.tgz$|.txz$|.tar.gz$|.tar.xz$|.zip$|.iso$|.rar$" # Pack files into desired format. # All files and directories by default. # Usage: pack [FILES] function pack() { local IFS=$'\n' local output="''${1}" local targets=("''${@:2}") local format="''${output##*.}" local name="''${output%.*}" # report no output. if [[ "''${output}" = "" ]]; then help pack return 2 fi # report no format. if [[ "''${format}" = "" ]]; then _error "Could not determine output format." help pack return 2 fi # All targets by default. [[ "''${targets}" = "" ]] && targets=(*) case "''${format}" in "tgz") _pack_tgz "''${output}" "''${targets[@]}" ;; "txz") _pack_txz "''${output}" "''${targets[@]}" ;; "tar") _pack_tar "''${output}" "''${targets[@]}" ;; "zip") _pack_zip "''${output}" "''${targets[@]}" ;; "gz") _pack_gz "''${output}" "''${targets[@]}" ;; "xz") _pack_xz "''${output}" "''${targets[@]}" ;; "iso") _pack_iso "''${output}" "''${targets[@]}" ;; *) _error "''${target}: Format not supported." return 2 ;; esac } # Attempt to unpack. # All supported formats by default. # Usage: unpack [FILES] function unpack() { local IFS=$'\n' local targets=(''${@}) [[ "''${targets}" = "" ]] && targets=($(_ls_files | grep -E ''${_unpack_supported})) process() { # Use full path to file. target=''$(realpath "''${target}") # Unpack file type. local type="''${target##*.}" [[ "''${target}" =~ .tar.gz$ ]] && type="tar.gz" [[ "''${target}" =~ .tar.xz$ ]] && type="tar.xz" # Make a dir for files. local dir="''${target%.$type}"; dir="''${dir##*/}" mkdir "''${dir}" > /dev/null pushd "''${dir}" > /dev/null # Unpack content. case "''${type,,}" in "zip") _unpack_zip "''${target}" ;; "7z") _unpack_7z "''${target}" ;; "tgz"|"tar.gz") _unpack_tgz "''${target}" ;; "txz"|"tar.xz") _unpack_txz "''${target}" ;; "tar") _unpack_tar "''${target}" ;; "iso") _unpack_iso "''${target}" ;; "rar") _unpack_rar "''${target}" ;; "xz") _unpack_xz "''${target}" ;; "gz") _unpack_gz "''${target}" ;; *) _error "''${target}: Format not supported." return 2 ;; esac # Cd back. popd > /dev/null } _iterate_targets process ''${targets[@]} } function _pack_zip() { zip -9 -r "''${@}" } function _pack_tgz() { tar -c "''${@:2}" | pv -s $(/usr/bin/env du -csb "''${@:2}" | sed -n -e '$p' | awk '{print $1}') | gzip -1 > "''${1}" } function _pack_txz() { tar -c "''${@:2}" | pv -s $(/usr/bin/env du -csb "''${@:2}" | sed -n -e '$p' | awk '{print $1}') | xz -9e > "''${1}" } function _pack_tar() { tar -c "''${@:2}" | pv -s $(/usr/bin/env du -csb "''${@:2}" | sed -n -e '$p' | awk '{print $1}') > "''${1}" } function _pack_gz() { pv "''${2}" | gzip -1 > "''${1}" } function _pack_xz() { pv "''${2}" | xz -9e > "''${1}" } function _pack_iso() { local input=("''${@:2}") local output="''${1}" local args=() for arg in ''${input[@]}; do [[ -d "''${arg}" ]] || { _error "''${arg} is not a directory." return 1 }; args+=("''${arg}=''${arg}") done genisoimage -J -r -pad -o "''${output}" -graft-points "''${args[@]}" } function _unpack_zip() { unzip "''${1}" } function _unpack_7z() { 7za x "''${1}" } function _unpack_tgz() { pv "''${1}" | gzip -d | tar -xf - } function _unpack_txz() { pv "''${1}" | xz -d | tar -xf - } function _unpack_tar() { pv "''${1}" | tar -xf - } function _unpack_iso() { 7za x "''${1}" } function _unpack_rar() { unrar x "''${1}" } function _unpack_gz() { pv "''${1}" | gzip -d > "''${1%.gz}" } function _unpack_xz() { pv "''${1}" | xz -d > "''${1%.xz}" } ''; }