extract.plugin.zsh 1.76 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
7
extract() {
	local remove_archive
	local success
	local file_name
	local extract_dir
Sorin Ionescu's avatar
Sorin Ionescu committed
8

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

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

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

Marc Cornellà's avatar
Marc Cornellà committed
24
25
26
27
28
29
	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
30

Marc Cornellà's avatar
Marc Cornellà committed
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
		success=0
		file_name="$( basename "$1" )"
		extract_dir="$( echo "$file_name" | sed "s/\.${1##*.}//g" )"
		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; tar xzvf ../data.tar.gz
				cd ..; rm *.tar.gz debian-binary
				cd ..
			;;
			(*)
				echo "extract: '$1' cannot be extracted" >&2
				success=1
			;;
		esac
Sorin Ionescu's avatar
Sorin Ionescu committed
68

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