cmprss
Mirrored on GitHub and Codeberg. GitHub is the official repo, but use either repo to contribute. Issues can't be synced so there may be some duplicates.
A compression multi-tool for the command line.
Replace tar with something you can remember.
Relevant XKCD.
All compression libraries are statically compiled in, so no runtime dependencies required.
Currently supports:
- bzip2
- gzip
- lz4
- tar
- xz
- zip
- zstd
Install
Installation is available through source code and cargo. cargo install cmprss will install the latest version.
For Nix users, the repository contains a flake and an overlay. nix run github:arcuru/cmprss
A fully static musl-linked binary is also available for Linux: nix build github:arcuru/cmprss#cmprss-static
Usage
The primary goal is to infer behavior based on the input, so that you don't need to remember esoteric CLI arguments.
cmprss supports being very explicit about the inputs and outputs for scripting, but will also behave intelligently when you leave out info.
All commands read from left to right, input is always either piped from stdin or the first filename(s) specified, and output is either stdout or the last filename/directory.
The easiest way to understand is to look at some examples
Compress a file with gzip
Compress 2 files into a tar archive
Compress stdin with xz
|
Extract a tar archive to the current directory
Extract an xz compressed file
Extract a gzip compressed file to stdout
Multi-level Compression
cmprss supports multi-level archives like .tar.gz, .tar.xz, or .zstd.bz2 directly:
# Compress a directory to a tar.gz file
# Extract a tar.xz file to a directory
# Gzip an existing tar archive
# Extract just the xz layer
Pipes can still be used if preferred:
| | |
Examples of Explicit Behavior
All these examples will work with any of the supported compression formats, provided that they support the input/output formats.
If output filenames are left out, cmprss will try to infer the filename based on the compression type.
Compress a file/directory to a tar archive:
Compress 2 files/directories into a tar archive:
Extract a tar archive:
cmprss will detect if stdin or stdout is a pipe, and use those for I/O where it makes sense.
Create and extract a tar.gz archive with pipes:
|
|
# Or a full roundtrip in one line
| | |
Contributing
Development Environment
The primary supported developer environment is defined in the flake.nix file.
This is a Nix Flake that pins versions of all packages used by cmprss.
It includes a devShell that can be used with direnv to use the tools each time you enter the directory.
That being said, cmprss is a very standard Rust application and should work with recent Rust toolchains.
The CI runs on both a stable Rust toolchain and the pinned Nix versions to verify correctness of both.
If you run into any issues developing with either the Nix environment or a stable Rust environment, please open a Github issue with the details.
Conventional Commits
Commits should conform to the Conventional Commits standard.
A script to help create conforming commits is provided in bin/commit.sh, or via task commit.
Test Coverage
PRs that improve the test coverage are encouraged.
Test coverage can be measured using cargo llvm-cov report and cargo tarpaulin.