forked from ohmyzsh/ohmyzsh
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request ohmyzsh#5476 from mcornella/fix-extract-deb-packages
Fix extract of deb packages with data.tar.xz
- Loading branch information
Showing
3 changed files
with
111 additions
and
75 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
# 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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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. | ||
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|*.xpi|*.apk) 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" 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) 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 | ||
|