extract.plugin.zsh 1.7 KB
Newer Older
Marc Cornellà's avatar
Marc Cornellà committed
1
alias x=extract
Sorin Ionescu's avatar
Sorin Ionescu committed
2

Marc Cornellà's avatar
Marc Cornellà committed
3
4
5
6
extract() {
	local remove_archive
	local success
	local extract_dir
Sorin Ionescu's avatar
Sorin Ionescu committed
7

Marc Cornellà's avatar
Marc Cornellà committed
8
9
10
	if (( $# == 0 )); then
		cat <<-'EOF' >&2
			Usage: extract [-option] [file ...]
Sorin Ionescu's avatar
Sorin Ionescu committed
11

Marc Cornellà's avatar
Marc Cornellà committed
12
			Options:
13
			    -r, --remove    Remove archive after unpacking.
Marc Cornellà's avatar
Marc Cornellà committed
14
15
		EOF
	fi
Sorin Ionescu's avatar
Sorin Ionescu committed
16

Marc Cornellà's avatar
Marc Cornellà committed
17
18
19
20
21
	remove_archive=1
	if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then
		remove_archive=0
		shift
	fi
Sorin Ionescu's avatar
Sorin Ionescu committed
22

Marc Cornellà's avatar
Marc Cornellà committed
23
24
25
26
27
28
	while (( $# > 0 )); do
		if [[ ! -f "$1" ]]; then
			echo "extract: '$1' is not a valid file" >&2
			shift
			continue
		fi
Sorin Ionescu's avatar
Sorin Ionescu committed
29

Marc Cornellà's avatar
Marc Cornellà committed
30
		success=0
31
		extract_dir="${1:t:r}"
32
		case "${1:l}" in
Marc Cornellà's avatar
Marc Cornellà committed
33
34
35
36
37
38
39
40
41
42
43
			(*.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" ;;
44
			(*.gz) (( $+commands[pigz] )) && pigz -dk "$1" || gunzip -k "$1" ;;
Marc Cornellà's avatar
Marc Cornellà committed
45
46
47
			(*.bz2) bunzip2 "$1" ;;
			(*.xz) unxz "$1" ;;
			(*.lzma) unlzma "$1" ;;
48
			(*.z) uncompress "$1" ;;
49
			(*.zip|*.war|*.jar|*.sublime-package|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$1" -d $extract_dir ;;
Marc Cornellà's avatar
Marc Cornellà committed
50
51
52
53
54
55
56
			(*.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
57
58
				cd ../data; extract ../data.tar.*
				cd ..; rm *.tar.* debian-binary
Marc Cornellà's avatar
Marc Cornellà committed
59
60
61
62
63
64
65
				cd ..
			;;
			(*)
				echo "extract: '$1' cannot be extracted" >&2
				success=1
			;;
		esac
Sorin Ionescu's avatar
Sorin Ionescu committed
66

Marc Cornellà's avatar
Marc Cornellà committed
67
68
69
70
		(( success = $success > 0 ? $success : $? ))
		(( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1"
		shift
	done
Sorin Ionescu's avatar
Sorin Ionescu committed
71
}