diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh old mode 100644 new mode 100755 index aed77e7d7..cfca62251 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -9,14 +9,41 @@ Usage: extract [-option] [file ...] Options: -r, --remove Remove archive after unpacking. + -t, --to-directory Extract to a specific directory instead of the current one. EOF fi local remove_archive=1 - if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then - remove_archive=0 - shift - fi + local target_directory="" + + while (( $# > 0 )); do + case "$1" in + -r|--remove) + remove_archive=0 + shift + ;; + -t|--to-directory) + shift + if (( $# == 0 )); then + echo "extract: -t/--to-directory requires a directory argument" >&2 + return 1 + fi + + target_directory="$1" + shift + + if [[ ! -d "$target_directory" ]]; then + echo "extract: '$target_directory' is not a valid directory" >&2 + return 1 + fi + + target_directory="${target_directory%/}" + ;; + *) + break + ;; + esac + done local pwd="$PWD" while (( $# > 0 )); do @@ -35,6 +62,10 @@ EOF extract_dir="${extract_dir:r}" fi + if [[ -n "$target_directory" ]]; then + extract_dir="$target_directory/${extract_dir:t}" + fi + # If there's a file or directory with the same name as the archive # add a random string to the end of the extract directory if [[ -e "$extract_dir" ]]; then