GNU ParallelによるBox CLIの強化

Yuko Taniguchi
Box Developer Japan Blog
7 min readJul 30, 2024

複数のBox CLIコマンドを同時に実行してワークフローの効率を高めようとしている方にお勧めの記事です。今回は、ジョブを並行して実行するための優れたツールであるGNU Parallelを使用して、Box CLIの操作を強化する方法について詳しく説明します。退屈な順次処理は止めて、タスクを迅速に実行できるようにしましょう。

GNU Parallelとは

GNU Parallelは、複数のジョブを並行して実行するためのシェルツールです。コマンドラインタスク向けのターボボタンがあるかのように、複数のジョブを同時に実行することで処理速度を向上します。速いだけではなく、柔軟性もあるため、並行して実行するジョブの数を制御したり、複雑なジョブの依存関係を処理したりできます。

GNU Parallelの設定

最初に、システム上でGNU Parallelを設定します。ここでは、さまざまなオペレーティングシステムでの設定方法を紹介します。

Ubuntu/Debianの場合:

sudo apt-get update
sudo apt-get install parallel

macOSの場合:

brew install parallel

CentOS/Fedoraの場合:

sudo yum install parallel

Windowsの場合:

Windowsユーザーの場合は、Cygwinが提供するUNIXのような環境でGNU Parallelを使用できます。以下に、簡単なガイドを示します。

  • こちらからCygwinをダウンロードしてインストールします。
  • インストール時に、必ず [Devel] カテゴリでparallelパッケージを選択してください。

インストールが完了したら、次のコマンドを実行してインストールを確認します。

parallel --version

GNU Parallelのバージョン番号が表示されます。

GNU ParallelとBox CLIの統合

Box CLIをインストール済みであれば、並列処理の力を利用する準備はほぼ整っています (インストールしていない場合は、インストール手順についてBox CLIのクイックスタートガイドを参照)。

入力ファイルの準備

GNU Parallelは、入力ファイルを使用すると驚くほど効果を発揮します。Boxアカウントに複数のファイルをアップロードする必要があるとします。ファイルごとに手動でコマンドを入力する代わりに、すべてのファイルパスをテキストファイルに列挙できます。

files-to-upload.txtという名前のファイルを作成し、アップロードする各ファイルパスを1行に1つずつ列挙します。

/path/to/file1.pdf
/path/to/file2.jpg
/path/to/file3.docx

並列コマンドの記述

次に、GNU Parallelを使用して入力ファイルから各行を読み取り、同時にBox CLIのアップロードコマンドを実行するコマンドを作成します。

parallel -j 10 box files:upload {} --parent-id 123456789 --name {/}  :::: files-to-upload.txt

このコマンドの詳細は以下のとおりです。

  • parallel: GNU Parallelを呼び出します。
  • -j 10: 10個のジョブを並行して実行します。この数値は、CPUの処理能力やネットワーク帯域幅に基づいて調整してください。省略すると、GNU Parallelは、並行して実行できるジョブの数を自動的に判定します。
  • box files:upload {} — parent-id 123456789 — name {/}: ファイルをアップロードするためのBox CLIコマンド。{} はファイル (ファイルパス) の入力行に置き換えられ、parent-idは、ファイルのアップロード先となるBox内のフォルダを示します。また、{/} により、アップロードされるファイルの名前として使用するファイルのベース名が抽出されます。
  • :::: files-to-upload.txt: GNU Parallelの入力ファイルを指定します。このコマンドは、必ずこのファイルが存在するディレクトリから実行してください。

シンプルなテキストファイルの代わりに、データを管理しやすくするためにCSVファイルを使用することもできます。Box内のユーザーのごみ箱から複数の項目を削除する必要があるとします。その場合の入力ファイルを準備する手順を以下に示します。

  • item_typeitem_iduser_idという列を含むinput.csvという名前のCSVファイルを作成します。見出しは、並列コマンドの実行時に除外するか、awkを使用してスキップします。
item_type,item_id,user_id
file,100000000,0000001
folder,100000001,0000002
file,100000002,0000001
  • awkを使用してこのCSVを処理し、GNU Parallelに渡します。
awk -F, 'NR > 1 {print $1 "," $2 "," $3}' input.csv | parallel -j12 --colsep ',' box trash:delete {1} {2} --as-user {3}

このコマンドの詳細は以下のとおりです。

  • awk -F, ‘NR > 1 {print $1 “,” $2 “,” $3}’ input.csv: 見出しをスキップしてCSVを解析し、各行を出力します。
  • parallel -j12 — colsep ‘,’ ‘box trash:delete {1} {2} — as-user {3}’: 12個のジョブを並行して実行します。{1}、{2}、{3}は、CSVの列を表すプレースホルダで、それぞれitem_type、item_id、user_idに対応しています。

コマンドの実行

ターミナルでこのコマンドを実行し、GNU Parallelによって複数のアップロードが同時に効率よく処理されるのを確認します。あたかも演奏者全員の演奏がぴったりと合っているオーケストラを指揮しているかのようです。ここでは各演奏者がクラウドにアップロードされる各ファイルに相当します。☁️

まとめ

Box CLIとGNU Parallelを併用することで、時間が節約されただけでなく、生産性を一変させるレベルの効率性も実現しました。大規模なデータセットの処理、定期的なバックアップの実行、一括ファイル操作の処理、多数のファイルの管理など、GNU ParallelとBox CLIの併用により、タスクは迅速かつ効率的に行われます。

GNU ParallelとBox CLIによる並列処理の力を利用すると、生産性が飛躍的に向上します。

Box CLIに関連した質問や知識共有が可能な、Box Developer Community (英語のみ) にご参加ください。🦄

--

--