diff options
Diffstat (limited to 'modules/home.legacy/conf/lf/commands/scripts/archive.sh')
-rwxr-xr-x | modules/home.legacy/conf/lf/commands/scripts/archive.sh | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/modules/home.legacy/conf/lf/commands/scripts/archive.sh b/modules/home.legacy/conf/lf/commands/scripts/archive.sh new file mode 100755 index 00000000..25f40534 --- /dev/null +++ b/modules/home.legacy/conf/lf/commands/scripts/archive.sh @@ -0,0 +1,77 @@ +#! /usr/bin/env dash + +# shellcheck source=/dev/null +SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH + +# Option '-f' disables pathname expansion which can be useful when $f, $fs, and +# $fx variables contain names with '*' or '?' characters. However, this option +# is used selectively within individual commands as it can be limiting at +# times. +set -f + +# shellcheck disable=SC2269 +f="$f" +# shellcheck disable=SC2269 +fx="$fx" +# shellcheck disable=SC2269 +fs="$fs" + +archivers="$(tmp echo gzip xz 7z zip)" +archiver="$(awk '{for (i=1; i<=NF; i++) print $i}' "$archivers" | fzf)" + +case "$archiver" in +"gzip") + ext=tar.gz + ;; +"xz") + ext=tar.xz + ;; +"7z") + ext=7z + ;; +"zip") + ext=zip + ;; +esac + +prompt "Archive name: " +name="" +while [ -z "$name" ] || [ -e "$name" ]; do + read -r name_base + name="$name_base.$ext" + if [ -e "$name" ]; then + prompt "Archive already exists, overwrite [y|N]: " + read -r ans + + if [ "$ans" = "y" ]; then + break + else + prompt "Archive name: " + fi + fi +done + +root="$(if [ "$(pwd)" = "/" ]; then pwd; else echo "$(pwd)/"; fi)" + +# fx contains all selected file name separated by a newline +while read -r raw_file; do + file="$(echo "$raw_file" | sed "s|$root||")" + set -- "$@" "$file" +done <"$(tmp echo "$fx")" + +case "$archiver" in +"gzip") + tar --create --gzip -file="$name" "$@" + ;; +"xz") + tar --create --file="$name" "$@" + xz --compress -9 --extreme --threads=0 "$name" + ;; +"7z") + 7z a "$name" "$@" + ;; +"zip") + zip --symlinks -9 -r "$name" "$@" + ;; +esac +# vim: ft=sh |