Commit 1159aa14 authored by Marc Cornellà's avatar Marc Cornellà Committed by GitHub
Browse files

Merge pull request #5476 from mcornella/fix-extract-deb-packages

Fix extract of deb packages with data.tar.xz
parents 1ad2556c bac896fc
# 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 |
| `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.
...@@ -3,6 +3,5 @@ ...@@ -3,6 +3,5 @@
_arguments \ _arguments \
'(-r --remove)'{-r,--remove}'[Remove archive.]' \ '(-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|bz2|deb|gz|ipsw|jar|lzma|rar|sublime-package|tar|tar.bz2|tar.gz|tar.xz|tar.zma|tbz|tbz2|tgz|tlz|txz|war|xpi|xz|zip)(-.)'" \
&& return 0
# ------------------------------------------------------------------------------ alias x=extract
# FILE: extract.plugin.zsh
# DESCRIPTION: oh-my-zsh plugin file.
# AUTHOR: Sorin Ionescu (sorin.ionescu@gmail.com)
# VERSION: 1.0.1
# ------------------------------------------------------------------------------
extract() {
local remove_archive
local success
local extract_dir
function extract() { if (( $# == 0 )); then
local remove_archive cat <<-'EOF' >&2
local success Usage: extract [-option] [file ...]
local file_name
local extract_dir
if (( $# == 0 )); then Options:
echo "Usage: extract [-option] [file ...]" -r, --remove Remove archive.
echo EOF
echo Options: fi
echo " -r, --remove Remove archive."
echo
echo "Report bugs to <sorin.ionescu@gmail.com>."
fi
remove_archive=1 remove_archive=1
if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then
remove_archive=0 remove_archive=0
shift shift
fi fi
while (( $# > 0 )); do while (( $# > 0 )); do
if [[ ! -f "$1" ]]; then if [[ ! -f "$1" ]]; then
echo "extract: '$1' is not a valid file" 1>&2 echo "extract: '$1' is not a valid file" >&2
shift shift
continue continue
fi fi
success=0 success=0
file_name="$( basename "$1" )" extract_dir="${1:t:r}"
extract_dir="$( echo "$file_name" | sed "s/\.${1##*.}//g" )" case "$1" in
case "$1" in (*.tar.gz|*.tgz) (( $+commands[pigz] )) && { pigz -dc "$1" | tar xv } || tar zxvf "$1" ;;
(*.tar.gz|*.tgz) [ -z $commands[pigz] ] && tar zxvf "$1" || pigz -dc "$1" | tar xv ;; (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;;
(*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;; (*.tar.xz|*.txz)
(*.tar.xz|*.txz) tar --xz --help &> /dev/null \ tar --xz --help &> /dev/null \
&& tar --xz -xvf "$1" \ && tar --xz -xvf "$1" \
|| xzcat "$1" | tar xvf - ;; || xzcat "$1" | tar xvf - ;;
(*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \ (*.tar.zma|*.tlz)
&& tar --lzma -xvf "$1" \ tar --lzma --help &> /dev/null \
|| lzcat "$1" | tar xvf - ;; && tar --lzma -xvf "$1" \
(*.tar) tar xvf "$1" ;; || lzcat "$1" | tar xvf - ;;
(*.gz) [ -z $commands[pigz] ] && gunzip "$1" || pigz -d "$1" ;; (*.tar) tar xvf "$1" ;;
(*.bz2) bunzip2 "$1" ;; (*.gz) (( $+commands[pigz] )) && pigz -d "$1" || gunzip "$1" ;;
(*.xz) unxz "$1" ;; (*.bz2) bunzip2 "$1" ;;
(*.lzma) unlzma "$1" ;; (*.xz) unxz "$1" ;;
(*.Z) uncompress "$1" ;; (*.lzma) unlzma "$1" ;;
(*.zip|*.war|*.jar|*.sublime-package|*.ipsw|*.xpi|*.apk) unzip "$1" -d $extract_dir ;; (*.Z) uncompress "$1" ;;
(*.rar) unrar x -ad "$1" ;; (*.zip|*.war|*.jar|*.sublime-package|*.ipsw|*.xpi|*.apk) unzip "$1" -d $extract_dir ;;
(*.7z) 7za x "$1" ;; (*.rar) unrar x -ad "$1" ;;
(*.deb) (*.7z) 7za x "$1" ;;
mkdir -p "$extract_dir/control" (*.deb)
mkdir -p "$extract_dir/data" mkdir -p "$extract_dir/control"
cd "$extract_dir"; ar vx "../${1}" > /dev/null mkdir -p "$extract_dir/data"
cd control; tar xzvf ../control.tar.gz cd "$extract_dir"; ar vx "../${1}" > /dev/null
cd ../data; tar xzvf ../data.tar.gz cd control; tar xzvf ../control.tar.gz
cd ..; rm *.tar.gz debian-binary cd ../data; extract ../data.tar.*
cd .. cd ..; rm *.tar.* debian-binary
;; cd ..
(*) ;;
echo "extract: '$1' cannot be extracted" 1>&2 (*)
success=1 echo "extract: '$1' cannot be extracted" >&2
;; success=1
esac ;;
esac
(( success = $success > 0 ? $success : $? )) (( success = $success > 0 ? $success : $? ))
(( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1" (( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1"
shift shift
done done
} }
alias x=extract
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment