summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorKonfekt <Konfekt@users.noreply.github.com>2021-01-05 18:53:29 +0100
committerGitHub <noreply@github.com>2021-01-05 18:53:29 +0100
commit492f712df281e96d6d1aa9ebb53b1304284b19a0 (patch)
treede3c0f0595a45b9dd8d3104158dc6b10df7d5a3c /plugins
parent2118d35e017eb8c599f3c25863c8263aca307541 (diff)
downloadzsh-492f712df281e96d6d1aa9ebb53b1304284b19a0.tar.gz
zsh-492f712df281e96d6d1aa9ebb53b1304284b19a0.tar.bz2
zsh-492f712df281e96d6d1aa9ebb53b1304284b19a0.zip
feat(plugins): add `universalarchive` plugin to conveniently compress files (#6846)
Co-authored-by: Marc Cornellà <marc.cornella@live.com>
Diffstat (limited to 'plugins')
-rw-r--r--plugins/universalarchive/README.md46
-rw-r--r--plugins/universalarchive/_universalarchive6
-rw-r--r--plugins/universalarchive/universalarchive.plugin.zsh70
3 files changed, 122 insertions, 0 deletions
diff --git a/plugins/universalarchive/README.md b/plugins/universalarchive/README.md
new file mode 100644
index 000000000..93a1bd9fc
--- /dev/null
+++ b/plugins/universalarchive/README.md
@@ -0,0 +1,46 @@
+# universalarchive plugin
+
+Lets you compress files by a command `ua <format> <files>`, supporting various
+compression formats (e.g. 7z, tar.gz, lzma, ...).
+
+To enable it, add `universalarchive` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... universalarchive)
+```
+
+## Usage
+
+Run `ua <format> <files>` to compress `<files>` into an archive file using `<format>`.
+For example:
+
+```sh
+ua xz *.html
+```
+
+this command will compress all `.html` files in directory `folder` into `folder.xz`.
+
+This plugin saves you from having to remember which command line arguments compress a file.
+
+## Supported compression formats
+
+| Extension | Description |
+|:-----------------|:-------------------------------|
+| `7z` | 7zip file |
+| `bz2` | Bzip2 file |
+| `gz` | Gzip file |
+| `lzma` | LZMA archive |
+| `lzo` | LZO archive |
+| `rar` | WinRAR archive |
+| `tar` | Tarball |
+| `tbz`/`tar.bz2` | Tarball with bzip2 compression |
+| `tgz`/`tar.gz` | Tarball with gzip compression |
+| `tlz`/`tar.lzma` | Tarball with lzma compression |
+| `txz`/`tar.xz` | Tarball with lzma2 compression |
+| `tZ`/`tar.Z` | Tarball with LZW compression |
+| `xz` | LZMA2 archive |
+| `Z` | Z archive (LZW) |
+| `zip` | Zip archive |
+| `zst` | Zstd archive |
+
+See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information regarding the archive formats.
diff --git a/plugins/universalarchive/_universalarchive b/plugins/universalarchive/_universalarchive
new file mode 100644
index 000000000..17cfd782e
--- /dev/null
+++ b/plugins/universalarchive/_universalarchive
@@ -0,0 +1,6 @@
+#compdef ua
+
+_arguments \
+ "1:archive format:(7z bz2 gz lzma lzo rar tar tar.bz2 tar.gz tar.lzma tar.xz tar.Z tbz tgz tlz txz tZ xz Z zip zst)" \
+ "*:input files:_files" \
+&& return 0
diff --git a/plugins/universalarchive/universalarchive.plugin.zsh b/plugins/universalarchive/universalarchive.plugin.zsh
new file mode 100644
index 000000000..5a661a5b0
--- /dev/null
+++ b/plugins/universalarchive/universalarchive.plugin.zsh
@@ -0,0 +1,70 @@
+function ua() {
+ local usage=\
+"Archive files and directories using a given compression algorithm.
+
+Usage: $0 <format> <files>
+Example: $0 tbz PKGBUILD
+
+Supported archive formats are:
+7z, bz2, gz, lzma, lzo, rar, tar, tbz (tar.bz2), tgz (tar.gz),
+tlz (tar.lzma), txz (tar.xz), tZ (tar.Z), xz, Z, zip, and zst."
+
+ if [[ $# -lt 2 ]]; then
+ echo >&2 "$usage"
+ return 1
+ fi
+
+ local ext="$1"
+ local input="$(realpath "$2")"
+
+ shift
+
+ if [[ ! -e "$input" ]]; then
+ echo >&2 "$input not found"
+ return 1
+ fi
+
+ # generate output file name
+ local output
+ if [[ $# -gt 1 ]]; then
+ output="$(basename "${input%/*}")"
+ elif [[ -f "$input" ]]; then
+ output="$(basename "${input%.[^.]*}")"
+ elif [[ -d "$input" ]]; then
+ output="$(basename "${input}")"
+ fi
+
+ # if output file exists, generate a random name
+ if [[ -f "${output}.${ext}" ]]; then
+ output=$(mktemp "${output}_XXX") && rm "$output" || return 1
+ fi
+
+ # add extension
+ output="${output}.${ext}"
+
+ # safety check
+ if [[ -f "$output" ]]; then
+ echo >&2 "output file '$output' already exists. Aborting"
+ return 1
+ fi
+
+ case "$ext" in
+ 7z) 7z u "${output}" "${@}" ;;
+ bz2) bzip2 -vcf "${@}" > "${output}" ;;
+ gz) gzip -vcf "${@}" > "${output}" ;;
+ lzma) lzma -vc -T0 "${@}" > "${output}" ;;
+ lzo) lzop -vc "${@}" > "${output}" ;;
+ rar) rar a "${output}" "${@}" ;;
+ tar) tar -cvf "${output}" "${@}" ;;
+ tbz|tar.bz2) tar -cvjf "${output}" "${@}" ;;
+ tgz|tar.gz) tar -cvzf "${output}" "${@}" ;;
+ tlz|tar.lzma) XZ_OPT=-T0 tar --lzma -cvf "${output}" "${@}" ;;
+ txz|tar.xz) XZ_OPT=-T0 tar -cvJf "${output}" "${@}" ;;
+ tZ|tar.Z) tar -cvZf "${output}" "${@}" ;;
+ xz) xz -vc -T0 "${@}" > "${output}" ;;
+ Z) compress -vcf "${@}" > "${output}" ;;
+ zip) zip -rull "${output}" "${@}" ;;
+ zst) zstd -c -T0 "${@}" > "${output}" ;;
+ *) echo >&2 "$usage"; return 1 ;;
+ esac
+}