diff options
Diffstat (limited to 'plugins/extract')
| -rw-r--r-- | plugins/extract/README.md | 47 | ||||
| -rw-r--r-- | plugins/extract/_extract | 5 | ||||
| -rw-r--r-- | plugins/extract/extract.plugin.zsh | 135 | 
3 files changed, 112 insertions, 75 deletions
| diff --git a/plugins/extract/README.md b/plugins/extract/README.md new file mode 100644 index 000000000..83b878c32 --- /dev/null +++ b/plugins/extract/README.md @@ -0,0 +1,47 @@ +# extract plugin + +This plugin defines a function called `extract` that extracts the archive file +you pass it, and it supports a wide variety of archive filetypes. + +This way you don't have to know what specific command extracts a file, you just +do `extract <filename>` and the function takes care of the rest. + +To use it, add `extract` to the plugins array in your zshrc file: + +```zsh +plugins=(... extract) +``` + +## Supported file extensions + +| Extension         | Description                          | +|:------------------|:-------------------------------------| +| `7z`              | 7zip file                            | +| `Z`               | Z archive (LZW)                      | +| `apk`             | Android app file                     | +| `aar`             | Android library file                 | +| `bz2`             | Bzip2 file                           | +| `deb`             | Debian package                       | +| `gz`              | Gzip file                            | +| `ipsw`            | iOS firmware file                    | +| `jar`             | Java Archive                         | +| `lzma`            | LZMA archive                         | +| `rar`             | WinRAR archive                       | +| `sublime-package` | Sublime Text package                 | +| `tar`             | Tarball                              | +| `tar.bz2`         | Tarball with bzip2 compression       | +| `tar.gz`          | Tarball with gzip compression        | +| `tar.xz`          | Tarball with lzma2 compression       | +| `tar.zma`         | Tarball with lzma compression        | +| `tbz`             | Tarball with bzip compression        | +| `tbz2`            | Tarball with bzip2 compression       | +| `tgz`             | Tarball with gzip compression        | +| `tlz`             | Tarball with lzma compression        | +| `txz`             | Tarball with lzma2 compression       | +| `war`             | Web Application archive (Java-based) | +| `xpi`             | Mozilla XPI module file              | +| `xz`              | LZMA2 archive                        | +| `zip`             | Zip archive                          | + +See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for +more information regarding archive formats. diff --git a/plugins/extract/_extract b/plugins/extract/_extract index 387b344bc..33d49fcc5 100644 --- a/plugins/extract/_extract +++ b/plugins/extract/_extract @@ -3,6 +3,5 @@  _arguments \    '(-r --remove)'{-r,--remove}'[Remove archive.]' \ -  "*::archive file:_files -g '(#i)*.(tar|tgz|tbz|tbz2|txz|tlz|gz|bz2|xz|lzma|Z|zip|ipsw|rar|7z|deb)(-.)'" && return 0 - - +  "*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|deb|gz|ipsw|jar|lzma|rar|sublime-package|tar|tar.bz2|tar.gz|tar.xz|tar.zma|tbz|tbz2|tgz|tlz|txz|war|whl|xpi|xz|zip)(-.)'" \ +    && return 0 diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 690126ba6..5e9b9ff24 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -1,80 +1,71 @@ -# ------------------------------------------------------------------------------ -#          FILE:  extract.plugin.zsh -#   DESCRIPTION:  oh-my-zsh plugin file. -#        AUTHOR:  Sorin Ionescu (sorin.ionescu@gmail.com) -#       VERSION:  1.0.1 -# ------------------------------------------------------------------------------ +alias x=extract +extract() { +	local remove_archive +	local success +	local extract_dir -function extract() { -  local remove_archive -  local success -  local file_name -  local extract_dir +	if (( $# == 0 )); then +		cat <<-'EOF' >&2 +			Usage: extract [-option] [file ...] -  if (( $# == 0 )); then -    echo "Usage: extract [-option] [file ...]" -    echo -    echo Options: -    echo "    -r, --remove    Remove archive." -    echo -    echo "Report bugs to <sorin.ionescu@gmail.com>." -  fi +			Options: +			    -r, --remove    Remove archive after unpacking. +		EOF +	fi -  remove_archive=1 -  if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then -    remove_archive=0 -    shift -  fi +	remove_archive=1 +	if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then +		remove_archive=0 +		shift +	fi -  while (( $# > 0 )); do -    if [[ ! -f "$1" ]]; then -      echo "extract: '$1' is not a valid file" 1>&2 -      shift -      continue -    fi +	while (( $# > 0 )); do +		if [[ ! -f "$1" ]]; then +			echo "extract: '$1' is not a valid file" >&2 +			shift +			continue +		fi -    success=0 -    file_name="$( basename "$1" )" -    extract_dir="$( echo "$file_name" | sed "s/\.${1##*.}//g" )" -    case "$1" in -      (*.tar.gz|*.tgz) [ -z $commands[pigz] ] && tar zxvf "$1" || pigz -dc "$1" | tar xv ;; -      (*.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) tar xvf "$1" ;; -      (*.gz) [ -z $commands[pigz] ] && gunzip "$1" || pigz -d "$1" ;; -      (*.bz2) bunzip2 "$1" ;; -      (*.xz) unxz "$1" ;; -      (*.lzma) unlzma "$1" ;; -      (*.Z) uncompress "$1" ;; -      (*.zip|*.war|*.jar|*.sublime-package|*.ipsw) unzip "$1" -d $extract_dir ;; -      (*.rar) unrar x -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 .. -      ;; -      (*) -        echo "extract: '$1' cannot be extracted" 1>&2 -        success=1 -      ;; -    esac +		success=0 +		extract_dir="${1:t:r}" +		case "${1:l}" in +			(*.tar.gz|*.tgz) (( $+commands[pigz] )) && { pigz -dc "$1" | tar xv } || tar zxvf "$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) tar xvf "$1" ;; +			(*.gz) (( $+commands[pigz] )) && pigz -d "$1" || gunzip "$1" ;; +			(*.bz2) bunzip2 "$1" ;; +			(*.xz) unxz "$1" ;; +			(*.lzma) unlzma "$1" ;; +			(*.z) uncompress "$1" ;; +			(*.zip|*.war|*.jar|*.sublime-package|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$1" -d $extract_dir ;; +			(*.rar) unrar x -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; extract ../data.tar.* +				cd ..; rm *.tar.* debian-binary +				cd .. +			;; +			(*) +				echo "extract: '$1' cannot be extracted" >&2 +				success=1 +			;; +		esac -    (( success = $success > 0 ? $success : $? )) -    (( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1" -    shift -  done +		(( success = $success > 0 ? $success : $? )) +		(( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1" +		shift +	done  } - -alias x=extract - | 
