From 492f712df281e96d6d1aa9ebb53b1304284b19a0 Mon Sep 17 00:00:00 2001 From: Konfekt Date: Tue, 5 Jan 2021 18:53:29 +0100 Subject: feat(plugins): add `universalarchive` plugin to conveniently compress files (#6846) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- plugins/universalarchive/README.md | 46 ++++++++++++++ plugins/universalarchive/_universalarchive | 6 ++ .../universalarchive/universalarchive.plugin.zsh | 70 ++++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 plugins/universalarchive/README.md create mode 100644 plugins/universalarchive/_universalarchive create mode 100644 plugins/universalarchive/universalarchive.plugin.zsh (limited to 'plugins/universalarchive') 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 `, 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 ` to compress `` into an archive file using ``. +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 +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 +} -- cgit v1.2.3-70-g09d2 From 3635d7cf7e300b5ba746c384fc3e87a35561e62d Mon Sep 17 00:00:00 2001 From: Marc Cornellà Date: Sun, 10 Jan 2021 17:22:52 +0100 Subject: fix(universalarchive): make plugin zsh-only to fix `realpath` not found error Fixes #9586 --- plugins/universalarchive/universalarchive.plugin.zsh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'plugins/universalarchive') diff --git a/plugins/universalarchive/universalarchive.plugin.zsh b/plugins/universalarchive/universalarchive.plugin.zsh index 5a661a5b0..b287c22b2 100644 --- a/plugins/universalarchive/universalarchive.plugin.zsh +++ b/plugins/universalarchive/universalarchive.plugin.zsh @@ -10,28 +10,28 @@ Supported archive formats are: tlz (tar.lzma), txz (tar.xz), tZ (tar.Z), xz, Z, zip, and zst." if [[ $# -lt 2 ]]; then - echo >&2 "$usage" + print -u2 -- "$usage" return 1 fi local ext="$1" - local input="$(realpath "$2")" + local input="${2:a}" shift if [[ ! -e "$input" ]]; then - echo >&2 "$input not found" + print -u2 -- "$input not found" return 1 fi # generate output file name local output if [[ $# -gt 1 ]]; then - output="$(basename "${input%/*}")" + output="${input:h:t}" elif [[ -f "$input" ]]; then - output="$(basename "${input%.[^.]*}")" + output="${input:r:t}" elif [[ -d "$input" ]]; then - output="$(basename "${input}")" + output="${input:t}" fi # if output file exists, generate a random name @@ -44,7 +44,7 @@ tlz (tar.lzma), txz (tar.xz), tZ (tar.Z), xz, Z, zip, and zst." # safety check if [[ -f "$output" ]]; then - echo >&2 "output file '$output' already exists. Aborting" + print -u2 -- "output file '$output' already exists. Aborting" return 1 fi @@ -65,6 +65,6 @@ tlz (tar.lzma), txz (tar.xz), tZ (tar.Z), xz, Z, zip, and zst." Z) compress -vcf "${@}" > "${output}" ;; zip) zip -rull "${output}" "${@}" ;; zst) zstd -c -T0 "${@}" > "${output}" ;; - *) echo >&2 "$usage"; return 1 ;; + *) print -u2 -- "$usage"; return 1 ;; esac } -- cgit v1.2.3-70-g09d2