build
crates.io
coverage
license
GitHub와 Codeberg에서 미러링됩니다. GitHub가 공식 레포지토리이지만, 어느 쪽을 사용해도 기여할 수 있습니다. 이슈는 동기화되지 않을 수 있으므로 중복이 있을 수 있습니다.
명령줄용 압축 다목적 도구입니다.
tar 대신 기억하기 쉬운 무언가를 대체하세요.
관련 XKCD.
모든 압축 라이브러리는 정적으로 컴파일되어 런타임 종속성이 필요하지 않습니다.
현재 지원하는 기능:
- brotli
- bzip2
- gzip
- lz4
- lzma (레거시 LZMA1)
- snappy (프레이밍된)
- tar
- xz
- zip
- zstd
설치
설치는 소스 코드와 cargo를 통해 가능합니다. cargo install cmprss를 실행하면 최신 버전이 설치됩니다.
Nix 사용자의 경우, 레포지토리에 flake와 overlay가 포함되어 있습니다. nix run github:arcuru/cmprss
완전히 정적 링크된 musl 바이너리도 Linux용으로 제공됩니다: nix build github:arcuru/cmprss#cmprss-static
쉘 완성 기능 (Shell Completions)
The Nix 패키지는 Bash, Fish, Zsh의 완성 기능을 자동으로 설치합니다.
다른 설치 방법의 경우, 해당 스니펫을 쉘 프로필에 추가하세요. 지원되는 쉘: bash, elvish, fish, powershell, zsh.
Bash (~/.bashrc):
source <(cmprss completions bash)
Zsh (~/.zshrc):
source <(cmprss completions zsh)
Fish (~/.config/fish/config.fish):
cmprss completions fish | source
사용법
주요 목표는 입력에 기반하여 동작을 추론하는 것이므로, 난해한 CLI 인수를 기억할 필요가 없습니다.
cmprss는 스크립팅을 위해 입력과 출력을 매우 명시적으로 처리하는 것을 지원하지만, 정보를 생략해도 지능적으로 작동합니다.
모든 명령어는 왼쪽에서 오른쪽으로 읽으며, 입력은 항상 stdin으로부터 파이프되거나 지정된 첫 번째 파일 이름 중 하나이며, 출력은 stdout 또는 마지막 파일/디렉토리입니다.
이해하기 가장 쉬운 방법은 몇 가지 예시를 살펴보는 것입니다.
gzip으로 파일 압축하기
cmprss file.txt file.txt.gz
2개의 파일을 tar 아카이브로 압축하기
cmprss file1.txt file2.txt archive.tar
xz를 사용하여 stdin 압축하기
cat file.txt | cmprss file.xz
현재 디렉터리로 tar 아카이브 추출하기
xz로 압축된 파일 추출하기
gzip으로 압축된 파일을 stdout으로 추출하기
cmprss file.txt.gz > file.txt
다단계 압축 (Multi-level Compression)
cmprss는 .tar.gz, .tar.xz, 또는 .zstd.bz2와 같은 다단계 아카이브를 직접 지원합니다.
cmprss directory out.tar.gz
...
일반적인 복합 단축 확장자도 작동하며, 긴 형식과 동일하게 동작합니다:
| 단축어 | 등가물 |
|---|
.tgz | .tar.gz |
| ... | |
당신은 또한 목표 파일 이름을 작성하지 않고 선행 인수로 복합 형식을 전달할 수 있습니다 (예: tar 하위 명령어처럼) 이를 명시적으로 만들 수 있습니다: | |
cmprss tar.gz directory
...
선호하는 경우 여전히 파이프를 사용할 수 있습니다:
cmprss tar dir | cmprss gz | cmprss gz -e | cmprss tar -e
명시적 동작 예시 (Examples of Explicit Behavior)
제공된 입력/출력 형식을 지원하는 한, 이 모든 예시는 어떤 압축 형식과도 작동합니다.
출력 파일 이름을 생략하면 cmprss는 압축 유형을 기반으로 파일 이름을 추론하려고 시도합니다.
파일/디렉터리를 tar 아카이브로 압축하기:
cmprss tar filename
cmprss tar filename my_preferred_output_name.tar
2개의 파일/디렉터리를 tar 아카이브로 압축하기:
cmprss tar dir_1/ dir_2/ combined.tar
cmprss tar file_1.txt file_2.txt
tar 아카이브 추출하기:
기존 tar 또는 zip 아카이브에 새 항목 추가하기:
cmprss tar --append new_file.txt archive.tar
cmprss zip -a new_file.txt extra_dir/ archive.zip
--append는 제자리에서 크기 조절이 가능한 컨테이너 형식에만 작동합니다. 스트림 코덱(gzip, xz 등)이나 tar.gz와 같은 복합 파이프라인은 전체 아카이브를 다시 작성하지 않고는 추가할 방법이 없으므로, 잘못된 작업을 조용히 처리하는 대신 오류를 발생시킵니다.
cmprss는 stdin 또는 stdout이 파이프인지 감지하여 의미가 있는 경우 해당 것을 I/O에 사용합니다.
파이프를 사용하여 tar.gz 아카이브 생성 및 추출:
cmprss tar directory | cmprss gzip > directory.tar.gz
cmprss gzip --extract directory.tar.gz | cmprss tar -e new_directory
...
라이브러리로 사용하기
cmprss는 바이너리(binary)와 라이브러리(library) 형태로 crates.io에 게시되었습니다. CLI가 사용하는 동일한 코덱, 스트리밍 트레이트(streaming traits), 파이프라인 컴포저(pipeline composer)는 다른 Rust 코드에서도 사용할 수 있습니다:
[dependencies]
cmprss = "0.4"
가장 일반적인 패턴들:
use cmprss::{CmprssInput, CmprssOutput, Compressor, Gzip, Pipeline};
...
각 패턴에 대한 작동 가능한 예제(runnable)는 examples/ 아래에 있으며 cargo run --example <이름>을 통해 실행할 수 있습니다. 전체 API는 https://docs.rs/cmprss에서 문서화되어 있습니다.
Cargo 기능 (Cargo features)
각 코덱은 동일한 이름의 기능(feature) 뒤에 막혀 있습니다 (gzip, xz, bzip2, zstd, lz4, brotli, snappy, lzma, tar, zip, sevenz). 전체 기능을 활성화하는 집합적인 full 기능이 있습니다. 의존성 트리를 줄이려면 기본 기능을 비활성화하고 일부 하위 집합을 선택적으로 사용하십시오:
cmprss = { version = "0.4", default-features = false, features = ["gzip", "tar"] }
전체 CLI 표면(clap에서 파생된 XArgs 구조체, X::new(args) 생성자, CommonArgs, LevelArgs, job 디스패치 모듈, 그리고 이를 뒷받침하는 clap / clap_complete / clap_mangen 의존성)은 기본적으로 cli 기능 뒤에 있습니다. clap을 자신의 트리에 원하지 않는 라이브러리 사용자는 다음처럼 제거할 수 있습니다:
cmprss = { version = "0.4", default-features = false, features = ["full"] }
Default::default()에 각 코덱 구조체의 공개 필드를 더하여 코덱을 구성할 수 있습니다. tests/ 아래의 통합 테스트와 examples/ 아래의 실행 가능한 예제는 두 가지 스타일을 모두 보여줍니다.
기여 (Contributing)
개발 환경 (Development Environment)
주요 지원 개발자 환경은 flake.nix 파일에 정의되어 있습니다.
이것은 cmprss가 사용하는 모든 패키지의 버전을 고정하는 Nix Flake입니다.
여기에 direnv와 함께 사용하여 디렉터리에 들어갈 때마다 도구를 사용할 수 있는 devShell이 포함되어 있습니다.
그럼에도 불구하고, cmprss는 매우 표준적인 Rust 애플리케이션이며 최신 Rust 툴체인과 작동해야 합니다.
CI는 안정 버전의 Rust 툴체인과 고정된 Nix 버전을 모두 사용하여 정확성을 검증합니다.
Nix 환경이나 안정 Rust 환경으로 개발하는 데 문제가 발생하면, 세부 정보를 포함하여 Github 이슈를 열어주십시오.
Conventional Commits (관습적 커밋)
커밋은 Conventional Commits 표준을 준수해야 합니다.
규격에 맞는 커밋 생성을 돕는 스크립트는 bin/commit.sh 또는 task commit을 통해 제공됩니다.
테스트 커버리지 (Test Coverage)
테스트 커버리지를 개선하는 PR은 환영합니다.
테스트 커버리지는 cargo llvm-cov report와 cargo tarpaulin을 사용하여 측정할 수 있습니다.