extract.plugin.zsh 2.25 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
			(*.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 - ;;
43
44
45
46
			(*.tar.zst|*.tzst)
				tar --zstd --help &> /dev/null \
				&& tar --zstd -xvf "$1" \
				|| zstdcat "$1" | tar xvf - ;;
Marc Cornellà's avatar
Marc Cornellà committed
47
			(*.tar) tar xvf "$1" ;;
48
			(*.tar.lz) (( $+commands[lzip] )) && tar xvf "$1" ;;
Aloxaf's avatar
Aloxaf committed
49
			(*.tar.lz4) lz4 -c -d "$1" | tar xvf - ;;
50
			(*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$1" ;;
51
			(*.gz) (( $+commands[pigz] )) && pigz -dk "$1" || gunzip -k "$1" ;;
Marc Cornellà's avatar
Marc Cornellà committed
52
53
			(*.bz2) bunzip2 "$1" ;;
			(*.xz) unxz "$1" ;;
54
			(*.lrz) (( $+commands[lrunzip] )) && lrunzip "$1" ;;
Aloxaf's avatar
Aloxaf committed
55
			(*.lz4) lz4 -d "$1" ;;
Marc Cornellà's avatar
Marc Cornellà committed
56
			(*.lzma) unlzma "$1" ;;
57
			(*.z) uncompress "$1" ;;
58
			(*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$1" -d "$extract_dir" ;;
Marc Cornellà's avatar
Marc Cornellà committed
59
			(*.rar) unrar x -ad "$1" ;;
60
			(*.rpm) mkdir "$extract_dir" && cd "$extract_dir" && rpm2cpio "../$1" | cpio --quiet -id && cd .. ;;
Marc Cornellà's avatar
Marc Cornellà committed
61
62
63
64
65
66
			(*.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
67
68
				cd ../data; extract ../data.tar.*
				cd ..; rm *.tar.* debian-binary
Marc Cornellà's avatar
Marc Cornellà committed
69
70
				cd ..
			;;
71
			(*.zst) unzstd "$1" ;;
72
			(*.cab) cabextract -d "$extract_dir" "$1" ;;
Marc Cornellà's avatar
Marc Cornellà committed
73
74
75
76
77
			(*)
				echo "extract: '$1' cannot be extracted" >&2
				success=1
			;;
		esac
Sorin Ionescu's avatar
Sorin Ionescu committed
78

Marc Cornellà's avatar
Marc Cornellà committed
79
80
81
82
		(( success = $success > 0 ? $success : $? ))
		(( $success == 0 )) && (( $remove_archive == 0 )) && rm "$1"
		shift
	done
Sorin Ionescu's avatar
Sorin Ionescu committed
83
}