bash : add pack/unpack.

This commit is contained in:
Dmitry Voronin 2023-11-02 23:36:10 +03:00
parent b952ea0583
commit e6b9f7d3e3
2 changed files with 182 additions and 0 deletions

View file

@ -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 <TARGET.ext> <FILES>`|Create desired file format with other files.
`unpack <FILES>`|Attempt to extract file content.
## Environment variables.
Variable|Description

175
.linux/bash/module/pack.sh Normal file
View file

@ -0,0 +1,175 @@
_PACK_SUPPORTED=".tar$|.zip$"
# Pack files into desired format.
# Usage: pack <TARGET.ext> <FILES>
pack()
{
local output="${1}"
local targets=("${@:2}")
local format="${output##*.}"
local name="${output%.*}"
# report no output.
if [[ "${output}" = "" ]]; then
echo "Usage: pack <TARGET.ext> <FILES>"
return 1
fi
# report no format.
if [[ "${format}" = "" ]]; then
echo "Could not determine output format."
echo "Usage: pack <TARGET.ext> <FILES>"
return 2
fi
# report no targets.
if [[ "${targets}" = "" ]]; then
echo "Usage: pack <TARGET.ext> <FILES>"
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 <FILES>
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 -
}