diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1377554 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/extr b/extr index 686d74c..f55d2e4 100755 --- a/extr +++ b/extr @@ -13,30 +13,35 @@ #You should have received a copy of the GNU General Public License #along with this program. If not, see . -#Copyright 2019 rexy712 +#Copyright 2019-2021 rexy712 function extr_usage() { if [ -n "$1" ];then echo "$1" >&2 fi echo "extr [OPTIONS...] [FILES...]" - echo "" - printf "\t%-25s%s\n" "-v, --verbose" "Verbose extraction" - printf "\t%-25s%s\n" "-q, --quiet" "Suppress as much output as possible" - printf "\t%-25s%s\n" "-f, --force" "Overwrite existing output files" - printf "\t%-25s%s\n" "-o, --output" "Output to given directory" - printf "\t%-25s%s\n" "-h, --help" "Output this help and exit" + printf "\t%-20s%s\n" "-v, --verbose" "Verbose extraction" + printf "\t%-20s%s\n" "-q, --quiet" "Suppress as much output as possible" + printf "\t%-20s%s\n" "-f, --force" "Overwrite existing output files" + printf "\t%-20s%s\n" "-o, --output" "Output to given directory" + printf "\t%-20s%s\n" "-h, --help" "Output this help and exit" - printf "\n%s Copyright (C) 2019 rexy712\n" "$0" - printf "This program comes with ABSOLUTELY NO WARRANTY.\n" - printf "This is free software, and you are welcome to redistribute it\n" - printf "under certain conditions; see the GNU GPLv3 for details.\n" - printf "A copy of the GPLv3 is available with the source in the file 'LICENSE'\n" + echo "" + echo "License GPLv3+: GNU GPL version 3 or later " + echo "This is free software: you are free to change and redistribute it." + echo "There is NO WARRANTY, to the extent permitted by law." + echo "Copyright (C) 2019-2021 rexy712" } function extr_unsupported_file(){ echo "Unsupported format. Ignoring." >&2 return 0 } +function check_output_dir_valid(){ + local dir="$1" + [ -d "${dir}" ] && return 0 + [ -e "${dir}" ] && return 1 + mkdir -p "${dir}" || return 1 +} function extr_handle_arguments(){ local pass_through= local -n verb=$1 @@ -67,6 +72,10 @@ function extr_handle_arguments(){ extr_usage "Missing argument to $1" fi outl="$2" + if ! check_output_dir_valid "$outl";then + should_q=1 + return 1 + fi shift ;; -h|--help) @@ -111,6 +120,206 @@ function fatal_error(){ exit 1 } +function do_tar(){ + local flags=() + if [ "$verbosity" == 1 ];then + #flags+=("--checkpoint") + :; + elif [ "$verbosity" == 2 ];then + flags+=("--verbose") + fi + if [ -n "$overwrite" ];then + flags+=("--overwrite") + else + flags+=("--keep-old-files") + fi + if [ -n "$outloc" ];then + flags+=("-C" "$outloc") + fi + tar "${flags[@]}" -xf "$file" "${passthrough_args[@]}" +} +function do_bz2(){ + local flags=() + if [ "$verbosity" == 0 ];then + flags+=("--quiet") + elif [ "$verbosity" == 2 ];then + flags+=("--verbose") + fi + if [ -n "$overwrite" ];then + flags+=("--force") + fi + if [ -n "$outloc" ];then + local fileout="${outloc}/$(basename "${file:0:-4}")" + if [ -e "${fileout}" ] && [ -z "$overwrite" ];then + echo "Could not decompress $file; output file exists" >&2 + return 0 + fi + bunzip2 -dk "${flags[@]}" "${passthrough_args[@]}" "$file" --stdout > "${fileout}" + else + bunzip2 -dk "${flags[@]}" "${passthrough_args[@]}" "$file" + fi +} +function do_gz(){ + local flags=() + if [ "$verbosity" == 0 ];then + flags+=("--quiet") + elif [ "$verbosity" == 2 ];then + flags+=("--verbose") + fi + if [ -n "$overwrite" ];then + flags+=("--force") + fi + if [ -n "$outloc" ];then + local fileout="${outloc}/$(basename "${file:0:-3}")" + if [ -e "${fileout}" ] && [ -z "$overwrite" ];then + echo "Could not decompress $file; output file exists" >&2 + return 0 + fi + gunzip -dk "${flags[@]}" "${passthrough_args[@]}" "$file" --stdout > "${fileout}" + else + gunzip -dk "${flags[@]}" "${passthrough_args[@]}" "$file" + fi +} +function do_zip(){ + local flags=() + if [ "$verbosity" -lt "2" ];then + flags+=("-q") + fi + if [ -n "$overwrite" ];then + flags+=("-o") + fi + if [ -n "$outloc" ];then + flags+=("-d" "$outloc") + fi + unzip "${flags[@]}" "${passthrough_args[@]}" "$file" +} +function do_uncompress(){ + local flags=() + if [ "$verbosity" == 2 ];then + flags+=("-v") + fi + if [ -n "$overwrite" ];then + flags+=("-f") + fi + if [ -n "$outloc" ];then + local fileout="${outloc}/$(basename "${file:0:-2}")" + if [ -e "${fileout}" ] && [ -z "$overwrite" ];then + echo "Could not decompress $file; output file exists" >&2 + return 0 + fi + uncompress "${flags[@]}" "${passthrough_args[@]}" "$file" -c > "${fileout}" + else + uncompress "${flags[@]}" "${passthrough_args[@]}" "$file" + fi +} +function do_7zip(){ + local flags=() + if [ -n "$outloc" ];then + flags+=("-o${outloc}") + fi + if [ -n "$overwrite" ];then + flags+=("-y") + fi + if [ "$verbosity" == 0 ];then + 7za x "${flags[@]}" "${passthrough_args[@]}" "$file" >/dev/null 2>&1 + else + 7za x "${flags[@]}" "${passthrough_args[@]}" "$file" + fi +} +function do_rar(){ + local flags=() + if [ "$verbosity" == 0 ];then + flags+=("-inul") + elif [ "$verbosity" == 2 ];then + flags+=("-ierr") + fi + if [ -n "$overwrite" ];then + flags+=("-o+") + else + flags+=("-o-") + fi + if [ -n "$outloc" ];then + local fileout="${outloc}/$(basename "${file:0:-4}")" + if [ -e "${fileout}" ] && [ -z "$overwrite" ];then + echo "Could not decompress $file; output file exists" >&2 + return 0 + fi + unrar "${flags[@]}" p "${passthrough_args[@]}" "$file" > "${fileout}" + else + unrar "${flags[@]}" x "${passthrough_args[@]}" "$file" + fi +} +function do_zstd(){ + local flags=() + if [ "$verbosity" == 0 ];then + flags+=("--quiet") + elif [ "$verbosity" == 2 ];then + flags+=("-v") + fi + if [ -n "$overwrite" ];then + flags+=("-f") + fi + if [ -n "$outloc" ];then + local fileout="${outloc}/$(basename "${file:0:-5}")" + if [ -e "${fileout}" ] && [ -z "$overwrite" ];then + echo "Could not decompress $file; output file exists" >&2 + return 0 + fi + unzstd -dk "${flags[@]}" "${passthrough_args[@]}" "$file" --stdout > "${fileout}" + else + unzstd -dk "${flags[@]}" "${passthrough_args[@]}" "$file" + fi +} +function do_xz(){ + local flags=() + if [ "$verbosity" == 0 ];then + flags+=("--quiet") + elif [ "$verbosity" == 2 ];then + flags+=("--verbose") + fi + if [ -n "$overwrite" ];then + flags+=("--force") + fi + if [ -n "$outloc" ];then + local fileout="${outloc}/$(basename "${file:0:-3}")" + if [ -e "${fileout}" ] && [ -z "$overwrite" ];then + echo "Could not decompress $file; output file exists" >&2 + return 0 + fi + xz -dk "${flags[@]}" "${passthrough_args[@]}" "$file" --stdout > "${fileout}" + else + xz -dk "${flags[@]}" "${passthrough_args[@]}" "$file" + fi +} + +function do_file_extension(){ + local file="$1" + case "$file" in + *.tar.*|*.tbz2|*.tgz|*.txz|*.tar|*.tarZ|*.targz|*.tarxz|*.tzst) + do_tar;; + *.bz2) + do_bz2;; + *.gz) + do_gz;; + *.zip) + do_zip;; + *.Z) + do_uncompress;; + *.7z) + do_7zip;; + *.rar) + do_rar;; + *.zst) + do_zstd;; + *.xz) + do_xz;; + *) + extr_unsupported_file || return -1;; + esac + retval=$? + return 0 +} + function _extr(){ local verbosity= local overwrite= @@ -128,169 +337,8 @@ function _extr(){ fi for file in "${filenames[@]}";do if [ -f "$file" ];then - case "$file" in - *.tar.*|*.tbz2|*.tgz|*.txz|*.tar|*.tarZ|*.targz|*.tarxz|*.tzst) - local flags=() - if [ "$verbosity" == 1 ];then - #flags+=("--checkpoint") - :; - elif [ "$verbosity" == 2 ];then - flags+=("--verbose") - fi - if [ -n "$overwrite" ];then - flags+=("--overwrite") - fi - if [ -n "$outloc" ];then - flags+=("-C" "$outloc") - fi - tar "${flags[@]}" -xf "$file" "${passthrough_args[@]}" - retval=$?;; - *.bz2) - local flags=() - if [ "$verbosity" == 0 ];then - flags+=("--quiet") - elif [ "$verbosity" == 2 ];then - flags+=("--verbose") - fi - if [ -n "$overwrite" ];then - flags+=("--force") - fi - if [ -n "$outloc" ];then - if [ ! "${file:0:1}" == "/" ];then - file="$PWD/$file" - fi - push_dir "$outloc" || continue - bunzip2 -dk "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$? - pop_dir || fatal_error - else - bunzip2 -dk "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$? - fi - ;; - *.gz) - local flags=() - if [ "$verbosity" == 0 ];then - flags+=("--quiet") - elif [ "$verbosity" == 2 ];then - flags+=("--verbose") - fi - if [ -n "$overwrite" ];then - flags+=("--force") - fi - if [ -n "$outloc" ];then - if [ ! "${file:0:1}" == "/" ];then - file="$PWD/$file" - fi - push_dir "$outloc" || continue - gunzip -dk "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$? - popd || fatal_error - else - gunzip -dk "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$? - fi - ;; - *.zip) - local flags=() - if [ "$verbosity" -lt "2" ];then - flags+=("-q") - fi - if [ -n "$overwrite" ];then - flags+=("-o") - fi - if [ -n "$outloc" ];then - flags+=("-d" "$outloc") - fi - unzip "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$?;; - *.Z) - local flags=() - if [ "$verbosity" == 2 ];then - flags+=("-v") - fi - if [ -n "$overwrite" ];then - flags+=("-f") - fi - if [ -n "$outloc" ];then - if [ ! "${file:0:1}" == "/" ];then - file="$PWD/$file" - fi - push_dir "$outloc" || continue - uncompress "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$? - pop_dir || fatal_error - else - uncompress "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$? - fi - ;; - *.7z) - local flags=() - if [ -n "$outloc" ];then - flags+=("-o${outloc}") - fi - if [ -n "$overwrite" ];then - flags+=("-y") - fi - if [ "$verbosity" == 0 ];then - 7za x "${flags[@]}" "${passthrough_args[@]}" "$file" >/dev/null 2>&1 - else - 7za x "${flags[@]}" "${passthrough_args[@]}" "$file" - fi - retval=$? - ;; - *.rar) - local flags=() - if [ "$verbosity" == 0 ];then - flags+=("-inul") - elif [ "$verbosity" == 2 ];then - flags+=("-ierr") - fi - if [ -n "$overwrite" ];then - flags+=("-o+") - else - flags+=("-o-") - fi - if [ -n "$outloc" ];then - if [ ! "${file:0:1}" == "/" ];then - file="$PWD/$file" - fi - push_dir "$outloc" || continue - unrar "${flags[@]}" x "${passthrough_args[@]}" "$file" - retval=$? - pop_dir || fatal_error - else - unrar "${flags[@]}" x "${passthrough_args[@]}" "$file" - retval=$? - fi - ;; - *.zst) - local flags=() - if [ "$verbosity" == 0 ];then - flags+=("--quiet") - elif [ "$verbosity" == 2 ];then - flags+=("-v") - fi - if [ -n "$overwrite" ];then - flags+=("-f") - fi - if [ -n "$outloc" ];then - if [ ! "${file:0:1}" == "/" ];then - file="$PWD/$file" - fi - push_dir "$outloc" || continue - unzstd -dk "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$? - pop_dir || fatal_error - else - unzstd -dk "${flags[@]}" "${passthrough_args[@]}" "$file" - retval=$? - fi - ;; - *) - _extr_unsupported_file || exit "$?";; - esac + do_file_extension "$file" + [ $? -lt 0 ] && exit "$ret" elif [[ -d "$file" ]];then echo "Cannot extract a directory: '$file'" >&2 retval=2 @@ -298,7 +346,6 @@ function _extr(){ echo "No such file or directory: '$file'" >&2 retval=3 fi - shift done return $retval }