_PACK_SUPPORTED=".tar$|.zip$" # Pack files into desired format. # Usage: pack pack() { local output="${1}" local targets=("${@:2}") local format="${output##*.}" local name="${output%.*}" # report no output. if [[ "${output}" = "" ]]; then echo "Usage: pack " return 1 fi # report no format. if [[ "${format}" = "" ]]; then echo "Could not determine output format." echo "Usage: pack " return 2 fi # report no targets. if [[ "${targets}" = "" ]]; then echo "Usage: pack " return 3 fi # process. case "${format}" in "tgz") _pack_tgz "${@}" ;; "txz") _pack_txz "${@}" ;; "tar") _pack_tar "${@}" ;; "zip") _pack_zip "${@}" ;; esac } # attempt to unpack everything. # usage: unpack unpack() { local targets=("${@}") local count=0 local failed=0 local total=${#targets[@]} # show error if no target specified. if [[ "${targets}" = "" ]]; then targets=($(ls | grep -E ${_PACK_SUPPORTED})) total=${#targets[@]} fi # process all files. for target in "${targets[@]}"; do # increment counter. ((count++)) # prepare status. local status="[${count}/${total}] ${target}" # show status. echo -e "${status}" # unpack file type. local type="${target##*.}" # unpack content. case "${type,,}" in "zip") _unpack_zip "${target}" ;; "7z") _unpack_7z "${target}" ;; "tgz") _unpack_tgz "${target}" ;; "txz") _unpack_txz "${target}" ;; "tar") _unpack_tar "${target}" ;; *) echo "${target}: format not supported." return 2 ;; esac # actions on error. if [[ $? != 0 ]]; then _error "${target}" ((failed++)) fi done # print report. if [[ ${count} -gt 1 ]]; then if [[ ${failed} -gt 0 ]]; then echo -e "${color_bred}Items failed to unpack: ${failed}.${color_default}" else echo -e "${color_green}All successful.${color_default}" fi fi } # show error. _error() { echo -e "${color_bred}${1}: failed.${color_default}" } # Pack zip. _pack_zip() { zip -9 -r "${@}" } # pack tgz. _pack_tgz() { tar -c "${@:2}" | pv -s $(du -csb "${@:2}" | sed -n -e '$p' | awk '{print $1}') | gzip -1 > "${1}" } # pack txz. _pack_txz() { tar -c "${@:2}" | pv -s $(du -csb "${@:2}" | sed -n -e '$p' | awk '{print $1}') | xz -9e > "${1}" } # pack tar. _pack_tar() { tar -c "${@:2}" | pv -s $(du -csb "${@:2}" | sed -n -e '$p' | awk '{print $1}') > "${1}" } # unpack zip archive. _unpack_zip() { unzip "${1}" } # unpack 7z archive. _unpack_7z() { 7z x "${1}" } # unpack tgz archive. _unpack_tgz() { pv "${1}" | gzip -d | tar -xf - } # unpack txz archive. _unpack_txz() { pv "${1}" | xz -d | tar -xf - } # unpack tar archive. _unpack_tar() { pv "${1}" | tar -xf - }