はじめに

この資料は Rust 製のコマンドラインツール chopstick について紹介するものです。

Rustの環境構築やツールのインストール方法については以下を参照してください

Rust開発環境を整える

chopstick について

最小限のサイズの実行ファイルで、できるだけシンプルな方法で、安全かつ高速にファイルを分割・結合をを行うCLIツールです。

chopstick

chop と stick

インストールすると chopstick の2つのコマンドが使用できるようになります。

chop

chop は、ファイルへのパスと、ファイルを分割する個数、または分割するサイズを受けつけます。 データの安全性を確保するため、chop は各パートのサイズに対して少なくとも十分な空き容量をディスク上に必要とします。エラーが発生した場合、部分的に完成した状態で終了することがありますが、ファイルのすべてのバイトはまだ無傷のままです。各部分を作成した後、次の部分を作成する前に、元のファイルは切り捨てられます(短縮されます)。このように、chop はデータを失うことなく、最小限のディスク空き容量を必要とします。また、chop のメモリ使用量は少なくて、一度にメモリに保持する必要があるのは (ファイル全体ではなく) 1 つの分割サイズだけだからです。このため、chop は数ギガバイトの巨大なファイルを分割するのに適しています。

stick

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