From 7d857a29fc1ae0ab2b529abcd140deceb6ee719d Mon Sep 17 00:00:00 2001 From: Vladislav Doster Date: Mon, 20 Nov 2023 00:57:12 -0600 Subject: [PATCH] feat: extract function Signed-off-by: Vladislav Doster --- zsh/.config/zsh/functions/extract | 63 +++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 zsh/.config/zsh/functions/extract diff --git a/zsh/.config/zsh/functions/extract b/zsh/.config/zsh/functions/extract new file mode 100644 index 00000000..77cfdef0 --- /dev/null +++ b/zsh/.config/zsh/functions/extract @@ -0,0 +1,63 @@ +#autoload + +extract () { + local remove_archive + local success + local file_name + local extract_dir + if [[ "$1" == "" ]]; then + echo "Usage: extract [-option] [file ...]" + echo + echo "Options:" + echo " -r, --remove : Remove archive." + echo + fi + remove_archive=1 + if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then + remove_archive=0 + shift + fi + while [ -n "$1" ]; do + if [[ ! -f "$1" ]]; then + print "'$1' is not a valid file" + shift + continue + fi + success=0 + file_name="$( basename "$1" )" + extract_dir="$( echo "$file_name" | sed "s/\.${1##*.}//g" )" + case "$1" in + (*.tar.gz|*.tgz) tar xvzf "$1" ;; + (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;; + (*.tar.xz|*.txz) tar --xz --help &> /dev/null && tar --xz -xvf "$1" || xzcat "$1" | tar xvf - ;; + (*.tar.zma|*.tlz) tar --lzma --help &> /dev/null && tar --lzma -xvf "$1" || lzcat "$1" | tar xvf - ;; + (*.tar.zstd) tar -I zstd -xvf "$1" ;; + (*.tar) tar xvf "$1" ;; + (*.gz) gunzip "$1" ;; + (*.bz2) bunzip2 "$1" ;; + (*.xz) unxz "$1" ;; + (*.lzma) unlzma "$1" ;; + (*.Z) uncompress "$1" ;; + (*.zip) unzip "$1" -d $extract_dir ;; + (*.rar) unrar e -ad "$1" ;; + (*.7z) 7za x "$1" ;; + (*.deb) mkdir -p "$extract_dir/control" + mkdir -p "$extract_dir/data" + cd "$extract_dir" + ar vx "../${1}" > /dev/null + cd control + tar xzvf ../control.tar.gz + cd ../data + tar xzvf ../data.tar.gz + cd .. + rm *.tar.gz debian-binary + cd .. ;; + (*) print "'$1' cannot be extracted" >&2 + success=1 ;; + esac + (( success = $success > 0 ? $success : $? )) + (( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1" + shift + done + return 0 +}