diff --git a/.README.md b/.README.md index ccd600e..9302193 100644 --- a/.README.md +++ b/.README.md @@ -457,6 +457,13 @@ Command|Description `dcpu [SERVICE]`|Update and recreate a compose service. `dcul [SERVICE]`|Start a compose service and show its logs. +## Pack. + +Command|Description +---|--- +`pack `|Create desired file format with other files. +`unpack `|Attempt to extract file content. + ## Environment variables. Variable|Description diff --git a/.linux/bash/module/pack.sh b/.linux/bash/module/pack.sh new file mode 100644 index 0000000..a7b15ce --- /dev/null +++ b/.linux/bash/module/pack.sh @@ -0,0 +1,175 @@ +_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 - +}