| 
									
										
										
										
											2016-09-29 13:19:47 +02:00
										 |  |  | alias x=extract | 
					
						
							| 
									
										
										
										
											2011-02-03 22:46:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 13:19:47 +02:00
										 |  |  | extract() { | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |   setopt localoptions noautopushd | 
					
						
							| 
									
										
										
										
											2021-08-14 22:05:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |   if (( $# == 0 )); then | 
					
						
							|  |  |  |     cat >&2 <<'EOF' | 
					
						
							|  |  |  | Usage: extract [-option] [file ...] | 
					
						
							| 
									
										
										
										
											2011-02-03 22:46:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  | Options: | 
					
						
							|  |  |  |     -r, --remove    Remove archive after unpacking. | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2011-02-03 22:46:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |   local remove_archive=1 | 
					
						
							|  |  |  |   if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then | 
					
						
							|  |  |  |     remove_archive=0 | 
					
						
							|  |  |  |     shift | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2011-02-03 22:46:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |   local pwd="$PWD" | 
					
						
							|  |  |  |   while (( $# > 0 )); do | 
					
						
							|  |  |  |     if [[ ! -f "$1" ]]; then | 
					
						
							|  |  |  |       echo "extract: '$1' is not a valid file" >&2 | 
					
						
							|  |  |  |       shift | 
					
						
							|  |  |  |       continue | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2011-02-03 22:46:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |     local success=0 | 
					
						
							|  |  |  |     local extract_dir="${1:t:r}" | 
					
						
							|  |  |  |     local file="$1" full_path="${1:A}" | 
					
						
							|  |  |  |     case "${file:l}" in | 
					
						
							| 
									
										
										
										
											2023-01-16 20:19:01 +08:00
										 |  |  |       (*.tar.gz|*.tgz) | 
					
						
							|  |  |  |         (( $+commands[pigz] )) && { tar -I pigz -xvf "$file" } || tar zxvf "$file" ;; | 
					
						
							|  |  |  |       (*.tar.bz2|*.tbz|*.tbz2) | 
					
						
							|  |  |  |         (( $+commands[pbzip2] )) && { tar -I pbzip2 -xvf "$file" } || tar xvjf "$file" ;; | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |       (*.tar.xz|*.txz) | 
					
						
							| 
									
										
										
										
											2023-01-16 20:19:01 +08:00
										 |  |  |         (( $+commands[pixz] )) && { tar -I pixz -xvf "$file" } || { | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |         tar --xz --help &> /dev/null \
 | 
					
						
							|  |  |  |         && tar --xz -xvf "$file" \
 | 
					
						
							| 
									
										
										
										
											2023-01-16 20:19:01 +08:00
										 |  |  |         || xzcat "$file" | tar xvf - } ;; | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |       (*.tar.zma|*.tlz) | 
					
						
							|  |  |  |         tar --lzma --help &> /dev/null \
 | 
					
						
							|  |  |  |         && tar --lzma -xvf "$file" \
 | 
					
						
							|  |  |  |         || lzcat "$file" | tar xvf - ;; | 
					
						
							|  |  |  |       (*.tar.zst|*.tzst) | 
					
						
							|  |  |  |         tar --zstd --help &> /dev/null \
 | 
					
						
							|  |  |  |         && tar --zstd -xvf "$file" \
 | 
					
						
							|  |  |  |         || zstdcat "$file" | tar xvf - ;; | 
					
						
							|  |  |  |       (*.tar) tar xvf "$file" ;; | 
					
						
							|  |  |  |       (*.tar.lz) (( $+commands[lzip] )) && tar xvf "$file" ;; | 
					
						
							|  |  |  |       (*.tar.lz4) lz4 -c -d "$file" | tar xvf - ;; | 
					
						
							|  |  |  |       (*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$file" ;; | 
					
						
							|  |  |  |       (*.gz) (( $+commands[pigz] )) && pigz -dk "$file" || gunzip -k "$file" ;; | 
					
						
							|  |  |  |       (*.bz2) bunzip2 "$file" ;; | 
					
						
							|  |  |  |       (*.xz) unxz "$file" ;; | 
					
						
							|  |  |  |       (*.lrz) (( $+commands[lrunzip] )) && lrunzip "$file" ;; | 
					
						
							|  |  |  |       (*.lz4) lz4 -d "$file" ;; | 
					
						
							|  |  |  |       (*.lzma) unlzma "$file" ;; | 
					
						
							|  |  |  |       (*.z) uncompress "$file" ;; | 
					
						
							|  |  |  |       (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$file" -d "$extract_dir" ;; | 
					
						
							|  |  |  |       (*.rar) unrar x -ad "$file" ;; | 
					
						
							|  |  |  |       (*.rpm) | 
					
						
							|  |  |  |         command mkdir -p "$extract_dir" && builtin cd -q "$extract_dir" \
 | 
					
						
							|  |  |  |         && rpm2cpio "$full_path" | cpio --quiet -id ;; | 
					
						
							|  |  |  |       (*.7z) 7za x "$file" ;; | 
					
						
							|  |  |  |       (*.deb) | 
					
						
							|  |  |  |         command mkdir -p "$extract_dir/control" "$extract_dir/data" | 
					
						
							|  |  |  |         builtin cd -q "$extract_dir"; ar vx "$full_path" > /dev/null | 
					
						
							|  |  |  |         builtin cd -q control; extract ../control.tar.* | 
					
						
							|  |  |  |         builtin cd -q ../data; extract ../data.tar.* | 
					
						
							|  |  |  |         builtin cd -q ..; command rm *.tar.* debian-binary ;; | 
					
						
							|  |  |  |       (*.zst) unzstd "$file" ;; | 
					
						
							|  |  |  |       (*.cab) cabextract -d "$extract_dir" "$file" ;; | 
					
						
							| 
									
										
										
										
											2023-02-22 10:16:28 +01:00
										 |  |  |       (*.cpio|*.obscpio) cpio -idmvF "$file" ;; | 
					
						
							| 
									
										
										
										
											2023-02-05 11:32:49 +04:00
										 |  |  |       (*.zpaq) zpaq x "$file" ;; | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |       (*) | 
					
						
							|  |  |  |         echo "extract: '$file' cannot be extracted" >&2 | 
					
						
							|  |  |  |         success=1 ;; | 
					
						
							|  |  |  |     esac | 
					
						
							| 
									
										
										
										
											2011-02-03 22:46:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |     (( success = success > 0 ? success : $? )) | 
					
						
							|  |  |  |     (( success == 0 && remove_archive == 0 )) && rm "$full_path" | 
					
						
							|  |  |  |     shift | 
					
						
							| 
									
										
										
										
											2011-02-03 22:46:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-14 22:03:41 +02:00
										 |  |  |     # Go back to original working directory in case we ran cd previously | 
					
						
							|  |  |  |     builtin cd -q "$pwd" | 
					
						
							|  |  |  |   done | 
					
						
							| 
									
										
										
										
											2011-02-03 22:46:52 -05:00
										 |  |  | } |