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
}