Parent directory

universalarchive.plugin.zsh

2264 bytes
 1function ua() {
 2  local usage=\
 3"Archive files and directories using a given compression algorithm.
 4
 5Usage:   $0 <format> <files>
 6Example: $0 tbz PKGBUILD
 7
 8Supported archive formats are:
 97z, bz2, gz, lzma, lzo, rar, tar, tbz (tar.bz2), tgz (tar.gz),
10tlz (tar.lzma), txz (tar.xz), tZ (tar.Z), xz, Z, zip, and zst."
11
12  if [[ $# -lt 2 ]]; then
13    print -u2 -- "$usage"
14    return 1
15  fi
16
17  local ext="$1"
18  local input="${2:a}"
19
20  shift
21
22  if [[ ! -e "$input" ]]; then
23    print -u2 -- "$input not found"
24    return 1
25  fi
26
27  # generate output file name
28  local output
29  if [[ $# -gt 1 ]]; then
30    output="${input:h:t}"
31  elif [[ -f "$input" ]]; then
32    output="${input:r:t}"
33  elif [[ -d "$input" ]]; then
34    output="${input:t}"
35  fi
36
37  # if output file exists, generate a random name
38  if [[ -f "${output}.${ext}" ]]; then
39    output=$(mktemp "${output}_XXX") && rm "$output" || return 1
40  fi
41
42  # add extension
43  output="${output}.${ext}"
44
45  # safety check
46  if [[ -f "$output" ]]; then
47    print -u2 -- "output file '$output' already exists. Aborting"
48    return 1
49  fi
50
51  case "$ext" in
52    7z)           7z u                        "${output}"   "${@}" ;;
53    bz2)          bzip2 -vcf                  "${@}" > "${output}" ;;
54    gz)           gzip -vcf                   "${@}" > "${output}" ;;
55    lzma)         lzma -vc -T0                "${@}" > "${output}" ;;
56    lzo)          lzop -vc                    "${@}" > "${output}" ;;
57    rar)          rar a                       "${output}"   "${@}" ;;
58    tar)          tar -cvf                    "${output}"   "${@}" ;;
59    tbz|tar.bz2)  tar -cvjf                   "${output}"   "${@}" ;;
60    tgz|tar.gz)   tar -cvzf                   "${output}"   "${@}" ;;
61    tlz|tar.lzma) XZ_OPT=-T0 tar --lzma -cvf  "${output}"   "${@}" ;;
62    txz|tar.xz)   XZ_OPT=-T0 tar -cvJf        "${output}"   "${@}" ;;
63    tZ|tar.Z)     tar -cvZf                   "${output}"   "${@}" ;;
64    xz)           xz -vc -T0                  "${@}" > "${output}" ;;
65    Z)            compress -vcf               "${@}" > "${output}" ;;
66    zip)          zip -rull                   "${output}"   "${@}" ;;
67    zst)          zstd -c -T0                 "${@}" > "${output}" ;;
68    *) print -u2 -- "$usage"; return 1 ;;
69  esac
70}