この資料は Rust 製のコマンドラインツール chopstick について紹介するものです。
Rustの環境構築やツールのインストール方法については以下を参照してください
最小限のサイズの実行ファイルで、できるだけシンプルな方法で、安全かつ高速にファイルを分割・結合をを行うCLIツールです。
インストールすると chop
と stick
の2つのコマンドが使用できるようになります。
chop
は、ファイルへのパスと、ファイルを分割する個数、または分割するサイズを受けつけます。
データの安全性を確保するため、chop は各パートのサイズに対して少なくとも十分な空き容量をディスク上に必要とします。エラーが発生した場合、部分的に完成した状態で終了することがありますが、ファイルのすべてのバイトはまだ無傷のままです。各部分を作成した後、次の部分を作成する前に、元のファイルは切り捨てられます(短縮されます)。このように、chop はデータを失うことなく、最小限のディスク空き容量を必要とします。また、chop のメモリ使用量は少なくて、一度にメモリに保持する必要があるのは (ファイル全体ではなく) 1 つの分割サイズだけだからです。このため、chop は数ギガバイトの巨大なファイルを分割するのに適しています。
stick
は、部分ファイル名(拡張子は不要)を受け取り、同じディレクトリ内の他の部分を発見しようと試み、そしてそれらを元に戻す。これは、あるひとつの部分ファイルをメモリに読み込んで、それを元のファイルに書き込み、その部分ファイルを削除し、すべての分断ファイルについてこれを繰り返えします。これにより、stick
は1つの部分ファイルが占有する分だけディスク空き容量があればうまく動作します。また、書き込みが成功する前に削除されることはないので、chop
と同様、データを失う危険性はありません。エラーが発生した場合は、部分的に完了した状態で終了しますが、ファイルのすべてのバイトは無傷のままの状態です。
% BASEURL=https://codeberg.org/alpha-tango-kilo/chopstick/archive/
% curl -sL $BASEURL/v1.0.0.tar.gz -o chopstick-1.0.0.tar.gz
% exa -l
.rw-r--r-- 31k goichiiisaka 13 Feb 08:13 chopstick-1.0.0.tar.gz
% chop --parts 3 chopstick-1.0.0.tar.gz
WARNING: unable to determine disk being used to check space
% exa -l
.rw-r--r-- 10k goichiiisaka 13 Feb 08:10 chopstick-1.0.0.tar.gz.p1
.rw-r--r-- 10k goichiiisaka 13 Feb 08:10 chopstick-1.0.0.tar.gz.p2
.rw-r--r-- 10k goichiiisaka 13 Feb 08:10 chopstick-1.0.0.tar.gz.p3
% stick chopstick-1.0.0.tar.gz
WARNING: couldn't canonicalise file path
% exa -l
.rw-r--r-- 31k goichiiisaka 13 Feb 08:13 chopstick-1.0.0.tar.gz
% tar tvf chopstick-1.0.0.tar.gz | headtail
drwxrwxr-x 0 root root 0 Mar 17 2022 chopstick/
-rw-rw-r-- 0 root root 8 Mar 17 2022 chopstick/.gitignore
-rw-rw-r-- 0 root root 324 Mar 17 2022 chopstick/.woodpecker.yml
-rw-rw-r-- 0 root root 13235 Mar 17 2022 chopstick/Cargo.lock
-rw-rw-r-- 0 root root 729 Mar 17 2022 chopstick/Cargo.toml
-rw-rw-r-- 0 root root 35149 Mar 17 2022 chopstick/LICENSE
-rw-rw-r-- 0 root root 4355 Mar 17 2022 chopstick/README.md
-rw-rw-r-- 0 root root 46 Mar 17 2022 chopstick/rustfmt.toml
drwxrwxr-x 0 root root 0 Mar 17 2022 chopstick/src/
drwxrwxr-x 0 root root 0 Mar 17 2022 chopstick/src/bin/
-rw-rw-r-- 0 root root 4777 Mar 17 2022 chopstick/src/bin/chop/main.rs
drwxrwxr-x 0 root root 0 Mar 17 2022 chopstick/src/bin/stick/
-rw-rw-r-- 0 root root 11045 Mar 17 2022 chopstick/src/bin/stick/args.rs
-rw-rw-r-- 0 root root 1799 Mar 17 2022 chopstick/src/bin/stick/error.rs
-rw-rw-r-- 0 root root 6581 Mar 17 2022 chopstick/src/bin/stick/main.rs
-rw-rw-r-- 0 root root 4802 Mar 17 2022 chopstick/src/lib.rs
drwxrwxr-x 0 root root 0 Mar 17 2022 chopstick/tests/
-rw-rw-r-- 0 root root 3572 Mar 17 2022 chopstick/tests/chop.rs
-rw-rw-r-- 0 root root 4123 Mar 17 2022 chopstick/tests/stick.rs
-rw-rw-r-- 0 root root 7947 Mar 17 2022 chopstick/tests/stress.r
% chop --help
chopstick 1.0.0
alpha-tango-kilo <[email protected]>
Separate files into parts quickly
USAGE:
chop [OPTIONS] <--size <part_size>|--parts <num_parts>> <file>
ARGS:
<file>
The file to split
OPTIONS:
--dry-run
Don't actually do anything, just tell me about it (implies --verbose)
[aliases: dry]
-h, --help
Print help information
-n, --parts <num_parts>
The number of parts to chop the file into. Parts will all be the same size (except the
last one potentially)
-r, --retain
Don't delete the original file (requires more disk space)
[aliases: no-delete, preserve]
-s, --size <part_size>
The maximum size each part should be. Accepts units - e.g. 1GB, 20K, 128MiB. The last
part may be smaller than the others
-v, --verbose
Makes chop tell you what it's doing
-V, --version
Print version information